![](/img/trans.png)
[英]The JSON data sent from Javascript is different than the JSON input received in Java Quarkus Service
[英]JSON received different from JSON sent with Spring Rest and Hibernate
我在使用 Spring Rest & Hibernate 时遇到了困难。 我正在从我的 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 请求/响应。
无论如何,提前感谢任何能指导我做出正确回应并保持安全的人。
事情是:
在您的实体中,该字段称为“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.