Java Spring mvc@RequestBody如何解析带有@EmbeddedId的JPA实体
我有两个实体:User和UserAlias。用户有复合PK。我有一些问题:Java Spring mvc@RequestBody如何解析带有@EmbeddedId的JPA实体,java,json,spring-mvc,jpa,jackson,Java,Json,Spring Mvc,Jpa,Jackson,我有两个实体:User和UserAlias。用户有复合PK。我有一些问题: 如何在spring MVC controller中解析JSON以填充User和UserPK对象,例如使用以下数据: { “id”:1, “名称”:“新用户”, “别名”:[ “别名1”, “别名2”, “别名3” ] } 如果我写public void createUser(@RequestBody User)我显然会得到一个异常。 如何编写控制器方法来解析两个实体的数据? 现在,我使用DTO对象解析带有@Request
public void createUser(@RequestBody User)
我显然会得到一个异常。如何编写控制器方法来解析两个实体的数据?
@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<>();
}
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;
}
1。第一个问题: 如何在SpringMVC控制器中解析JSON以填充User和UserPK对象 您的JSON必须与您的实体结构相匹配,因此您需要在
User
对象中有一个UserId
对象,以匹配预期的结构。在您的情况下,您正在共享的JSON将与此不匹配,并且将在传递给Spring控制器时引发异常
这是您作为JSON所需要的:
{ "userid": {"id" : 1, "name" : "newUser"}, "aliases": [ "alias1", "alias2", "alias3" ] }
2。第二个问题:
现在,我使用DTO对象解析带有@RequestBody的JSON并填充模型。但我不确定这是否是完成这项任务的好方法
是的,这是一种使用DTO
的好方法,特别是如果您不想保持当前使用的JSON
结构不变,并且使用传递的DTO
可以分别构造用户
对象
使用:
如果您想避免使用
DTO
,只需使用,使用userId
字段,这样它的属性将被序列化为User
类的属性,您的第一个JSON
将被接受。谢谢您的回答,但是我应该如何将UserId
对象添加到User
类中呢?我已经有了@EmbeddedId private UserPK userid
也许我误解了你的答案?@insci实际上是json中的userid
,将表示@EmbeddedId private UserPK userid
,它的名称userId
将表明这一点,当然也表明相同的结构。您不需要编辑实体中的任何内容。好的,我知道了,但是有没有办法不修改json?我的意思是,现在我正在使用DTO,但是有没有其他方法来处理这个问题?@insci Yes您可以在userId
字段上使用@JsonUnwrapped
Jackson注释,它的属性将被序列化为User
类的属性,并且您的第一个json将被匹配。
{ "userid": {"id" : 1, "name" : "newUser"}, "aliases": [ "alias1", "alias2", "alias3" ] }