繁体   English   中英

收到的 JSON 与使用 Spring Rest 和 Hibernate 发送的 JSON 不同

[英]JSON received different from JSON sent with Spring Rest and Hibernate

我在使用 Spring Rest & Hibernate 时遇到了困难。 我正在从我的 Android 应用程序进行 API 调用,其中一个 POST 调用似乎有问题。

我有 2 个课程: PlayerGame

@Entity
@Table(name = "Game", schema = "statistics")
public class GameEntity {
    private int matchId;
    private int firstPlayer;
    private int secondPlayer;

    @Column(name = "first_player")
    public int getFirstPlayer() {
        return firstPlayer;
    }

    public void setFirstPlayer(int firstPlayer) {
        this.firstPlayer = firstPlayer;
    }

    @Column(name = "second_player")
    public int getSecondPlayer() {
        return secondPlayer;
    }

    public void setSecondPlayer(int secondPlayer) {
        this.secondPlayer = secondPlayer;
    }
}

@Entity
@Table(name = "Players", schema = "statistics")
public class PlayersEntity {
    private int playerId;
    private String name;

    @Id
    @Column(name = "player_id")
    public int getPlayerId() {
        return playerId;
    }

    public void setPlayerId(int id) {
        this.playerId = id;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }Ga

    public void setName(String name) {
        this.name = name;
    }
}

当我为Player发送 POST 时:它起作用了。 然而,当我对Game做同样的事情时,它拒绝它,因为它没有正确接收值 - 当我调试@RequestBody我发现接收到的实体包含不正确的值(所有字段都是 0,因为所有字段都是整数):

不正确的 json 值

尽管如此,发送的 JSON 具有正确的值:

正确的 JSON

我最终遇到了 SQL 错误(因为Game中的 3 个 id 中有 2 个是引用Player外键)。

我真的不明白为什么,我不知道如何在 Spring 上记录 HTTP 请求/响应。

无论如何,提前感谢任何能指导我做出正确回应并保持安全的人。

事情是:

在您的实体中,该字段称为“firstPlayer”,而在您的 JSON 中,该字段称为“first_player”。

请注意,您在字段上放置的 @Column 注释仅适用于存储到数据库表中,不适用于后端和前端之间的 JSON 转换。

为此,我可能会构建一个自定义的 DTO/VO,而不是重用您的 @Entity,并使用适当的 Jackson 映射注释:@JsonProperty。

@JsonProperty("player_id")
private int playerId;

问题在于 JSON 反序列化不查看 JPA 注释。 因此,您发送的 JSON 之间存在不匹配,它使用了snake_case和 Java 属性,它们在camelCase

至少有 3 个选项可以解决此问题:

在整个应用程序范围内启用 Snake-case

spring.jackson.property-naming-strategy=SNAKE_CASE

为特定类启用 Snake-Case

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class GameEntity {

}

提供自定义 JsonCreator 构造函数

请注意,JPA 也需要默认构造函数

@Entity
@Table(name = "Game", schema = "statistics")
public class GameEntity {
    private int matchId;
    private int firstPlayer;
    private int secondPlayer;

    public GameEntity() {}

    @JsonCreator
    public GameEntity(@JsonProperty("match_id") int matchId,
                      @JsonProperty("first_player") int firstPlayer,
                      @JsonProperty("second_player") int secondPlayer) {
        this.matchId = matchId;
        this.firstPlayer = firstPlayer;
        this.secondPlayer = secondPlayer;
    }

    ...

}

请注意,有一个额外的不匹配:您在 Java 中有matchId ,在 JSON 中有game_id 只有第三种方法可以让您在不重命名 Java 中的字段的情况下解决它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM