我有2个实体:User和UserAlias。用户具有复合PK。我有一些问题:
如何在spring MVC控制器中解析JSON以填充User和UserPK对象,例如,使用以下数据:
{ “ id”:1 “ name”:“ newUser”, “别名”:[ “ alias1”, “ alias2”, “ alias3” ] }
如果我写public void createUser(@RequestBody User user)
,我显然会例外。
我如何编写控制器方法以将数据解析到两个实体?
User.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<>();
}
UserPK.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;
}
}
UserAlias.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;
}
答案 0 :(得分:2)
1。第一个问题:
如何在Spring MVC控制器中解析JSON以填充User和UserPK对象?
那么您的JSON必须与您的实体结构匹配,因此您需要在UserId
对象内部有一个User
对象,以便与预期的结构匹配。在您的情况下,您共享的JSON与之不匹配,并且在传递给Spring Controller时将引发Exception。
这就是您将需要的JSON:
{ "userid": {"id" : 1, "name" : "newUser"}, "aliases": [ "alias1", "alias2", "alias3" ] }
2。第二个问题:
目前,我正在使用DTO对象使用@RequestBody解析JSON并填充模型。但是我不确定这是完成此任务的好方法吗?
是的,这是使用DTO
的好方法,特别是如果您不保留当前使用的JSON
结构,并且使用传递的DTO
可以构造分别是User
个对象。
@JsonUnwrapped
annotation:如果您想避免使用DTO
,则只需将 Jackson's @JsonUnwrapped
annotation 与userId
字段一起使用,这样其属性将是序列化为User
类的属性,并且您的第一个JSON
将被接受。