我有 2 个实体:User 和 UserAlias。用户有复合PK。我有一些问题:
如何在 spring MVC Controller 中解析 JSON 以填充 User 和 UserPK 对象,例如使用以下数据:
{ “编号”:1, “名称”:“新用户”, “别名”:[ “别名1”, “别名2”, “别名3” ]
如果我写public void createUser(@RequestBody User user)
我显然会得到一个异常。
我如何编写我的 Controller 方法来将数据解析到两个实体?
- 目前,我正在使用 DTO 对象通过 @RequestBody 解析 JSON 并填充模型。但我不确定这是完成这项任务的好方法。
用户.java
@Entity
@Table(name = "user")
public class User {
@EmbeddedId
private UserPK userid;
public User(){}
public User(UserPK userid) {
this.userid = userid;
this.aliases = aliases;
}
@OneToMany(
mappedBy = "user",
cascade = CascadeType.ALL,
orphanRemoval = true
)
public List<UserAlias> aliases = new ArrayList<>();
}
用户PK.java
@Embeddable
public class UserPK implements Serializable {
@NotNull
@Column(name = "id")
private Integer id;
@NotNull
@Column(name = "name")
private String name;
public UserPK(){};
public UserPK(Integer id, String name){
this.id = id;
this.name = name;
}
}
用户别名.java
@Entity
@Table(name = "user_alias")
public class UserAlias {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
@Column(name = "user_alias")
private String userAlias;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(
referencedColumnName = "id"),
@JoinColumn(
referencedColumnName = "name")
})
@JsonIgnore
public User user;
public UserAlias(){}
public UserAlias(String userAlias) {
this.userAlias = userAlias;
}
最佳答案
<强>1。第一个问题:
How to parse JSON in spring MVC controller to populate User and UserPK objects?
那么您的 JSON 必须匹配您的实体结构,因此您需要在 User
对象中有一个 UserId
对象,以便匹配预期的结构。在您的情况下,您共享的 JSON 将不匹配,并且在传递给 Spring Controller 时会抛出异常。
这是您需要的 JSON:
{ "userid": {"id" : 1, "name" : "newUser"}, "aliases": [ "alias1", "alias2", "alias3" ] }
<强>2。第二个问题:
For now i'm using a DTO object to parse JSON with @RequestBody and populate models. But i'm not sure this is good way to do this task?
是的,这是使用 DTO
的好方法,特别是如果您不想保留您现在正在使用的相同 JSON
结构,并使用传递的 DTO
你可以分别构造你的 User
对象。
使用@JsonUnwrapped
annotation :
如果你想避免使用DTO
,你可以只使用 Jackson's @JsonUnwrapped
annotation ,使用您的 userId
字段,这样它的属性将被序列化为 User
类的属性,您的第一个 JSON
将是接受了。
关于java - Spring mvc @RequestBody如何用@EmbeddedId解析JPA实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51208935/