Spring MVC @RequestBody如何使用@EmbeddedId解析JPA实体

时间:2018-07-06 11:00:32

标签: java json spring-mvc jpa jackson

我有2个实体:User和UserAlias。用户具有复合PK。我有一些问题:

  1. 如何在spring MVC控制器中解析JSON以填充User和UserPK对象,例如,使用以下数据:

    {   “ id”:1   “ name”:“ newUser”,   “别名”:[     “ alias1”,     “ alias2”,     “ alias3”   ] }

如果我写public void createUser(@RequestBody User user),我显然会例外。
我如何编写控制器方法以将数据解析到两个实体?

  1. 现在我正在使用DTO对象使用@RequestBody解析JSON并填充模型。但我不确定这是否是完成此任务的好方法。

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;
    }

1 个答案:

答案 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将被接受。