JSON 收到的 JSON 与 Spring 发送的不同 Spring 休息和休眠
JSON received different from JSON sent with Spring Rest and Hibernate
我在 Spring 休息和休眠方面遇到困难。我正在从我的 Android 应用程序进行 API 调用,其中一个 POST 调用似乎有问题。
我有 2 个 类:Player
和 Game
@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
中的字段的情况下解决它
我在 Spring 休息和休眠方面遇到困难。我正在从我的 Android 应用程序进行 API 调用,其中一个 POST 调用似乎有问题。
我有 2 个 类:Player
和 Game
@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