繁体   English   中英

Java 关于反序列化继承 class 的一些问题

[英]Java some issue about deserialize inherit class

当我尝试将 object 从 postman 发送到 restcontroller 时,它无法按预期反序列化。 我的代码:

基类:

@Data
@MappedSuperclass
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class BaseClass  implements Serializable{

    private static final long serialVersionUID = -93167525523223059L;
    
    private String id;

}

用户:

@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class User extends BaseClass{

    private static final long serialVersionUID = -93167525523563033L;
    
    private String name;
    
    private String email;
   
    // ...other fields
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class Group extends BaseClass{

    private static final long serialVersionUID = -93167115523563033L;
    
    private String name;
    
    private Set<User> users;

    // ...other fields
}

休息控制器

    @PutMapping("/{id}")
    public void updateGroup(@PathVariable String id, @RequestBody Group group) {
        // some code @debug// 
        return null;
    }

当我使用 Postman 发出请求时,我的请求正文是:

{
    "id": "group1",
    "users": [
    {
        "id": "user1"
    },
    {
        "id": "user2"
    },
    {
        "id": "user3"
    }]
}

我在@debug 中调试,发现@RequestBody 组只有一个user{id=user1}

我做了一些研究,知道了一种解决方案。 如果我将请求正文更改为

{
    "id": "group1",
    "users": [
    {
        "id": "user1",
        "name": "name1"
    },
    {
        "id": "user2",
        "name": "name2"
    },
    {
        "id": "user3",
        "name": "name3"
    }]
}

有效。 而且我发现,在反序列化时,识别用户的关键似乎是(名称,电子邮件),在用户中,而不是在 BaseClass 中的 id。 所以我的问题是,这是我认为对的吗? 如果是这样,当我只提供 id 时如何更改我的代码以获取三个用户。 在我当前的项目中,用户有很多属性,所以我只想发送一些字段,而不是全部。 所以不想发名字,email等字段。

默认情况下,json 反序列化过程认为 class 的所有属性都存在于给定的 json 字符串中。 如果只需要特定属性并且如果 rest 是可选的,那么javax.annotation.Nullable注释可以用于非强制性属性,如下所示:

public class User extends BaseClass {
    private String name;

    @Nullable
    private String email;
    /*..*/
}

此外,为了更好地控制 object 层次结构,您还可以使用Jackson 库并定义 object 层次结构,如下所示:

底座 class:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "id")
@JsonSubTypes(value = {
    @JsonSubTypes.Type(name = "group", value = Group.class),
    @JsonSubTypes.Type(name = "user", value = User.class)})
public class BaseClass {
    private String id;
}

子类:

@JsonTypeName(value = "user")
public class User extends BaseClass {
    /*..*/
}

@JsonTypeName(value = "group")
public class Group extends BaseClass {
    /*..*/
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM