使用构建器模式的 Jackson 反序列化:"Build method has bad return type, not compatible with POJO type"
Jackson deserialization with builder pattern: "Build method has bad return type, not compatible with POJO type"
我有一个使用构建器模式的简单 class。
public class Foo implements FooInterface {
.....
public static final class Builder {
public Builder setValueA(String value) {...}
public Builder setValueB(String value) {...}
public FooInterface build() {...}
}
}
请注意,我的 Builder.build() 方法实际上 return 是接口类型的对象,而不是实现类型的对象。然后我混合注释(因为 class Foo 实际上是第 3 方 class)来定义接口 FooInterface 的子类型,如下所示:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Foo.class, name = "foo")})
public abstract class FooInterfaceMixin {}
和 mixin 用于定义 class Foo 的构建器模式,如下所示:
@JsonTypeName("foo")
@JsonDeserialize(builder=Foo.Builder.class)
public abstract class FooMixin {}
最后,为了反序列化,我这样做:
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(FooInterface.class, FooInterfaceMixin.class);
mapper.addMixIn(Foo.class, FooMixin.class);
final String jsonString = "{\"type\":\"foo\", \"valueA\":\"a\", \"valueB\":\"b\"}";
FooInterface foo = mapper.readValue(jsonString, FooInterface.class);
我收到错误 Build 方法 'Foo$Builder#build(0 params) 有错误的 return 类型 (FooInterface),与 POJO 类型不兼容 (Foo )
看起来 this 是罪魁祸首,但我不明白为什么 return 在构建方法中使用超类型是不可接受的。有什么想法吗?
它看起来像一个 Jackson 错误。我报告了一个问题:
https://github.com/FasterXML/jackson-databind/issues/761
我有一个使用构建器模式的简单 class。
public class Foo implements FooInterface {
.....
public static final class Builder {
public Builder setValueA(String value) {...}
public Builder setValueB(String value) {...}
public FooInterface build() {...}
}
}
请注意,我的 Builder.build() 方法实际上 return 是接口类型的对象,而不是实现类型的对象。然后我混合注释(因为 class Foo 实际上是第 3 方 class)来定义接口 FooInterface 的子类型,如下所示:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Foo.class, name = "foo")})
public abstract class FooInterfaceMixin {}
和 mixin 用于定义 class Foo 的构建器模式,如下所示:
@JsonTypeName("foo")
@JsonDeserialize(builder=Foo.Builder.class)
public abstract class FooMixin {}
最后,为了反序列化,我这样做:
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(FooInterface.class, FooInterfaceMixin.class);
mapper.addMixIn(Foo.class, FooMixin.class);
final String jsonString = "{\"type\":\"foo\", \"valueA\":\"a\", \"valueB\":\"b\"}";
FooInterface foo = mapper.readValue(jsonString, FooInterface.class);
我收到错误 Build 方法 'Foo$Builder#build(0 params) 有错误的 return 类型 (FooInterface),与 POJO 类型不兼容 (Foo )
看起来 this 是罪魁祸首,但我不明白为什么 return 在构建方法中使用超类型是不可接受的。有什么想法吗?
它看起来像一个 Jackson 错误。我报告了一个问题: https://github.com/FasterXML/jackson-databind/issues/761