JSON 收到的 JSON 与 Spring 发送的不同 Spring 休息和休眠

JSON received different from JSON sent with Spring Rest and Hibernate

我在 Spring 休息和休眠方面遇到困难。我正在从我的 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 具有正确的值:

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

我真的不明白为什么,我不知道如何在 Spring 上记录 HTTP Requests/Responses。

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

事情是:

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

请注意,您在字段上添加的 @Column 注释仅对存储到数据库 table 有效,对后端和前端之间的 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

为特定 class

启用 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

中的字段的情况下解决它