Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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 Jackson ObjectMapper默认值与codhaus和fasterexml上的lombok_Java_Jackson_Lombok - Fatal编程技术网

Java Jackson ObjectMapper默认值与codhaus和fasterexml上的lombok

Java Jackson ObjectMapper默认值与codhaus和fasterexml上的lombok,java,jackson,lombok,Java,Jackson,Lombok,我使用org.codehaus.jackson.map.ObjectMapper对JSON字符串进行反序列化,默认值如下: 我有以下几点建议: @Data @Builder @EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor public class CompanyRequest { @Builder.Default private String email = ""; private i

我使用
org.codehaus.jackson.map.ObjectMapper
对JSON字符串进行反序列化,默认值如下:

我有以下几点建议:

@Data
@Builder
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class CompanyRequest {
    @Builder.Default
    private String email = "";
    private int company;
    @Builder.Default
    List<UserIdMapping> users = new ArrayList<>();
}

其中消息是:

{
  "email": "john@doe.com",
  "company": 42,
}

它按预期工作,这意味着
companyRequest
users
初始化为空
ArrayList

然后我切换到
com.fasterxml.jackson.databind.ObjectMapper
,但是
users
对于相同的
消息
null

我可以通过以下更改来解决此问题:

@Data
@EqualsAndHashCode
@Builder
public class CompanyRequest {
    private String email;
    private int company;
    private List<UserIdMapping> users;

    @JsonCreator
    public CompanyRequest() {
        this.email = "";
        this.users = new ArrayList<>();
    }

    @Builder
    public CompanyRequest(String email, int company, List<UserIdMapping> users) {
        this.sfAccountId = StringUtils.isEmpty(email) ? "" : email;
        this.company = company;
        this.users = CollectionUtils.isEmpty(users) ? new ArrayList<>() : users;
    }
}
@数据
@EqualsAndHashCode
@建筑商
公共类公司请求{
私人字符串电子邮件;
私营int公司;
私人名单用户;
@JsonCreator
上市公司要求{
this.email=“”;
this.users=new ArrayList();
}
@建筑商
public CompanyRequest(字符串电子邮件、整数公司、列表用户){
this.sfAccountId=StringUtils.isEmpty(电子邮件)?“”:电子邮件;
这个公司=公司;
this.users=CollectionUtils.isEmpty(用户)?新建ArrayList():用户;
}
}
但是在知道
codehaus
在没有这种操作的情况下实际上可以按预期工作之后,我想知道是否有一种更干净的方法可以使用
fasterxml
,因为
fasterxml
ObjectMapper
的更新版本, 这意味着它是一种功能吗?

杰克逊的“codehaus”版本是杰克逊的1.x版本。自2.0以来,Jackson位于“com.fasterxml.Jackson”。在没有测试过它的情况下,很有可能是Jackson 2简单地(有意地)改变了行为

然而,正如您自己发现的,您可以明确建议Jackson在反序列化时使用no-args构造函数。您还可以将该注释放在lombok生成的构造函数上,这样就不必手动编写:

@数据
@建筑商
@EqualsAndHashCode
@NoArgsConstructor(onConstructor_u=@JsonCreator)
@AllArgsConstructor
公共类公司请求{
@Builder.Default
私人字符串email=“”;
私营int公司;
@Builder.Default
列表用户=新建ArrayList();
}
确保至少使用Lombok v1.18.2,以便确保
@Builder。此构造函数中也设置了默认值

如果您希望不可变,并且生成器是创建实例的唯一方法(至少使用Lombok v1.18.16),请考虑在类上放置
@Jacksonized@Builder

@Jacksonized
@建筑商
@价值观
公共类公司请求{
@Builder.Default
私人字符串email=“”;
私营int公司;
@奇异的
列出用户名单;
}

如果从
用户中删除
@Builder.Default
,则
fasterxml jackson
的行为如何?它仍然将
用户设置为
null
,这是因为jackson faterxml使用
@allargsconstuctor
用户设置为
null
,而codhaus使用默认构造函数和setters谢谢!看起来正是我想要的,现在就测试它你让它工作了吗,还是仍然有问题?
@Data
@EqualsAndHashCode
@Builder
public class CompanyRequest {
    private String email;
    private int company;
    private List<UserIdMapping> users;

    @JsonCreator
    public CompanyRequest() {
        this.email = "";
        this.users = new ArrayList<>();
    }

    @Builder
    public CompanyRequest(String email, int company, List<UserIdMapping> users) {
        this.sfAccountId = StringUtils.isEmpty(email) ? "" : email;
        this.company = company;
        this.users = CollectionUtils.isEmpty(users) ? new ArrayList<>() : users;
    }
}