Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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 使用生成器时无法执行自定义反序列化_Java_Jackson_Lombok - Fatal编程技术网

Java 使用生成器时无法执行自定义反序列化

Java 使用生成器时无法执行自定义反序列化,java,jackson,lombok,Java,Jackson,Lombok,在这种情况下,我从外部源接收一个布尔值,作为字符串“0”或“1”。 映射时,Jackson不考虑这一点,并抛出以下错误: InvalidFormatException:无法反序列化类型为布尔值的值 从字符串“1” 因此,我正在进行以下自定义反序列化,这是有效的 在没有构建器的情况下完成的工作示例 @Getter public class MyClass { @JsonDeserialize(using = NumericBooleanDeserializer.class) @J

在这种情况下,我从外部源接收一个布尔值,作为字符串“0”或“1”。 映射时,Jackson不考虑这一点,并抛出以下错误:

InvalidFormatException:无法反序列化类型为
布尔值的值
从字符串“1”

因此,我正在进行以下自定义反序列化,这是有效的

在没有构建器的情况下完成的工作示例

@Getter
public class MyClass {

    @JsonDeserialize(using = NumericBooleanDeserializer.class)
    @JsonProperty("bool")
    private boolean bool;

    // many other fields
}

class NumericBooleanDeserializer extends JsonDeserializer<Boolean> {

    @Override
    public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        return "1".equals(parser.getText());
    }
}
编辑:根据下面的答案尝试建议的选项

备选案文1:

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MyClass {

    @JsonDeserialize(using = NumericBooleanDeserializer.class)
    @JsonProperty("bool")
    private boolean bool;

    // many other fields

    @JsonSetter
    private void setBool(String value){
        this.bool = "1".equals(value);
    }
}

class NumericBooleanDeserializer extends JsonDeserializer<Boolean> {

    @Override
    public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        return !"0".equals(parser.getText());
    }
}
获取以下错误:

com.fasterxml.jackson.databind.exc.InvalidFormatException:无法 从字符串“1”反序列化类型为
布尔值的值:仅“true”或
在[Source:(String)“{”bool:“1”}”行识别“false”;第1行,
列:9](通过引用链:
a、 a.a.MyClass$MyClassBuilder[“bool”])

更新2020-11-03:Lombok 1.18.16发布

从Lombok 1.18.16开始,您可以使用
@Jacksonized
自动生成Jackson使用Lombok
@(超级)生成器所需的所有内容

@Getter
@Jacksonized
@Builder
public class MyClass {
    @JsonDeserialize(using = NumericBooleanDeserializer.class)
    private boolean bool;

    // many other fields
}
对于早期的Lombok版本,必须自定义生成器,以便将注释添加到生成器的setter方法中。在您的情况下,它的工作原理如下:

@Getter
@Builder
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
public class MyClass {
    private boolean bool;

    // many other fields

    public static class MyClassBuilder {
        @JsonDeserialize(using = NumericBooleanDeserializer.class)
        @JsonProperty("bool")
        public MyClassBuilder bool(boolean bool) {
            this.bool = bool;
            return this;
        }
    }
}

Lombok认识到构建器已经有了一个类定义,并且只为您没有手动实现的方法生成代码。

Perfect this works!但是,考虑到现在已经为bool方法添加了注释,我可以说不再需要对字段本身进行注释了吗?当我删除bool变量的注释时,它运行良好。想确认是否有任何理由在两端加上注释?是的。我只是将注释放在那里以保持一致性,但如果您只是使用反序列化,则不需要注释。我更新了答案(删除了字段上的注释)。我使用新的
@Jacksonized
方法(使用lombok>=1.18.16)更新了答案。我要感谢您的回答。成功了!但是,我有两个带有生成器注释的模型。其中一个模型(仅包含字符串变量)被反序列化而没有任何问题。对于一个模型(它只包含一个链表),我必须添加这个@Jacksonized来反序列化它。为什么?
@Getter
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MyClass {

    @JsonDeserialize(using = NumericBooleanDeserializer.class)
    @JsonProperty("bool")
    private boolean bool;
}
@Getter
@Jacksonized
@Builder
public class MyClass {
    @JsonDeserialize(using = NumericBooleanDeserializer.class)
    private boolean bool;

    // many other fields
}
@Getter
@Builder
@JsonDeserialize(builder = MyClass.MyClassBuilder.class)
public class MyClass {
    private boolean bool;

    // many other fields

    public static class MyClassBuilder {
        @JsonDeserialize(using = NumericBooleanDeserializer.class)
        @JsonProperty("bool")
        public MyClassBuilder bool(boolean bool) {
            this.bool = bool;
            return this;
        }
    }
}