【问题标题】:Spring mvc @RequestBody how to parse JPA Entity with @EmbeddedIdSpring mvc @RequestBody 如何使用 @EmbeddedId 解析 JPA 实体
【发布时间】:2018-12-14 23:26:16
【问题描述】:

我有 2 个实体:用户和用户别名。用户有复合PK。我有一些问题:

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

    { “身份证”:1, “名称”:“新用户”, “别名”:[ "别名1", “别名2”, “别名 3” ] }

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

  1. 现在我使用 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<>();
    }

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

}

用户别名.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;
    }

【问题讨论】:

    标签: java json spring-mvc jpa jackson


    【解决方案1】:

    1.第一个问题:

    如何在 Spring MVC 控制器中解析 JSON 以填充 User 和 UserPK 对象?

    您的 JSON 必须与您的实体结构相匹配,因此您需要在您的 User 对象内有一个 UserId 对象以匹配预期的结构。在您的情况下,您共享的 JSON 将不匹配,并且在传递给 Spring Controller 时会抛出异常。

    这是您需要的 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字段,这样它的属性将被序列化为@的属性987654334@ 课程和你的第一个JSON 将被接受。

    【讨论】:

    • 感谢您的回答,但我应该如何将UserId 对象添加到User 类?我已经有@EmbeddedId private UserPK userid; 也许我误解了你的答案?
    • @insci 实际上,json 中的userid 将是@EmbeddedId private UserPK userid; 的表示,它的名称userId 将表明这一点,当然也是相同的结构。您无需编辑实体中的任何内容。
    • 好的,我知道了,但是有没有办法不修改json?我的意思是现在我正在使用 DTO,但是还有其他方法可以解决这个问题吗?
    • @insci 是的,您可以在 userId 字段上使用 @JsonUnwrappedJackson 注释,其属性将被序列化为 User 类的属性,并且您的第一个 json 将被匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多