java - Spring mvc @RequestBody如何用@EmbeddedId解析JPA实体

标签 java json spring-mvc jpa jackson

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

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

    { “编号”:1, “名称”:“新用户”, “别名”:[ “别名1”, “别名2”, “别名3” ]

如果我写public void createUser(@RequestBody User user) 我显然会得到一个异常。
我如何编写我的 Controller 方法来将数据解析到两个实体?

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

用户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/

相关文章:

java - JLayeredPane 中的面板显示其后面的按钮

Android Studio 找不到JDK Mac

java - HHH000302 : Unable to construct current session context [org. springframework.orm.hibernate4.SpringSessionContext]

java - 每天的spring cron表达式1 :01:am

java - 从异步任务获取空响应,响应代码为 200,这意味着成功

javascript - 按键获取 json 最大计数

javascript - 在 map 制作器上创建事件

javascript - 将 json 对象保存为文本文件

java - Spring MVC :- How do i get the uploaded image to display on jsp page as soon as the user selects the image. 我在这里使用Spring框架

java - Spring 模块中的 CacheSecond