Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring mvc@RequestBody如何解析带有@EmbeddedId的JPA实体_Java_Json_Spring Mvc_Jpa_Jackson - Fatal编程技术网

Java Spring mvc@RequestBody如何解析带有@EmbeddedId的JPA实体

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

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

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

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

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

  • 现在,我使用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<>();
        }
    
    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" ] }