Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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解析为子类_Java_Jackson_Subtype - Fatal编程技术网

Java 默认情况下使用Jackson解析为子类

Java 默认情况下使用Jackson解析为子类,java,jackson,subtype,Java,Jackson,Subtype,我有一个名为Product的类和一些扩展它的子类。现在,在我的注释中,我有许多类型,如下所示: @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT) @JsonSubTypes({@Type(value=RoomProduct.class, name="RoomProduct"), @Type(value=GroundProduct.class, name="Groun

我有一个名为Product的类和一些扩展它的子类。现在,在我的注释中,我有许多类型,如下所示:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({@Type(value=RoomProduct.class, name="RoomProduct"),
           @Type(value=GroundProduct.class, name="GroundProduct"),
           })
然后是我的产品类的定义。我想做的是,如果Jackson无法检测到磁场不符合这些结构,返回一个

未知产品


我如何使用Jackson@Type注释实现这一点?它应该像在名称中输入空白或在值中输入一些我不知道的标志(我已尝试创建扩展产品的UnknownProduct,但未成功地在名称值中添加任何内容。

@JsonTypeInfo有一个指定默认实现类的选项,但经过一些调试后,我发现WrapperObject的“defaultImpl”被破坏。配置:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.WRAPPER_OBJECT, defaultImpl = UnknownProduct.class)
Jackson实现(AsWrapperTypeDeserializer):

另一个解决方案: 如果必须使用WRAPPER_对象,则可以将Jackson配置为在找到未知子类型时不会失败:

objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
这与你的要求不完全相同,但在这种情况下,你的产品将为空。也许你可以将空视为未知产品

更新 我已经提交了一个Jackson bug:


更新此问题已解决,适用于2.3和2.4 jackson,希望很快您能够在JAR重新安装到maven存储库或新版本时使用它。

不完全是我想要的,尽管我尝试过,但仍然得到了JsonMappingException。我知道您可以在e@JsonTypeInfo,但我无法让它工作,我的头是:@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.WRAPPER\u对象,defaultImpl=UnknownProduct.class)。谢谢Ilya!它正在处理我的测试应用程序:没有JsonMappingException,Project被解析为null。如果您发布Product、RoomProduct、GroundProduct和进行序列化/反序列化的类,我可以看一看,我发现WRAPPER\u对象有一个忽略defaultImpl类的错误。请查看更新的解决方案。@StaxMan这是我今天在Jackson Jira中创建的一张票证。不确定您想说什么。啊,对不起,没有注意到您上面的更新(打开了旧版本)说明了我的意思。:)
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type", defaultImpl = UnknownProduct.class)
objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);