maven-jaxb2-plugin生成类场景下JAXB反序列化抽象类报错咨询
问题2:xsi:type是否为必填项,XML是否符合XSD规范
是必填项,你收到的XML不符合对应XSD规范。
XSD中如果某元素绑定的complexType声明为abstract="true",实例XML中该节点必须通过xsi:type显式指定具体的非抽象子类型,否则属于格式校验不通过的情况。
问题1:无xsi:type时实现正常反序列化的方案
有多个可落地的方案,你可以根据自身场景选择:
- XmlAdapter自定义类型映射
你可以自己实现一个JAXB类型适配器,直接把抽象父类的反序列化指向你要使用的具体子类:
public class NachrichtenkopfG2GAdapter extends XmlAdapter<NachrichtenkopfG2G2, NachrichtenkopfG2G> { @Override public NachrichtenkopfG2G unmarshal(NachrichtenkopfG2G2 v) { return v; } @Override public NachrichtenkopfG2G2 marshal(NachrichtenkopfG2G v) { return (NachrichtenkopfG2G2) v; } }
因为你的类是maven插件自动生成的,不要直接修改生成的类,通过你已引入annox扩展的xjb绑定文件给父类加注解即可:
<jaxb:bindings node="xs:complexType[@name='Nachrichtenkopf.G2G']"> <annox:annotate> <annox:annotate annox:class="javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter" value="你自己的适配器包名.NachrichtenkopfG2GAdapter"/> </annox:annotate> </jaxb:bindings>
- XML预处理
不需要改动JAXB相关配置,反序列化前先对入站XML做文本处理,给所有缺失xsi:type的nachrichtenkopf节点补上对应的类型属性和xsi命名空间,再送入Unmarshaller解析,适合临时应急场景。 - 自定义实例创建逻辑
给Unmarshaller配置自定义的实例工厂或者Unmarshaller.Listener,拦截到要创建NachrichtenkopfG2G实例的请求时,直接返回NachrichtenkopfG2G2的实例即可。
内容的提问来源于stack exchange,提问作者tim-danger
相关产品推荐
相关产品推荐

