我有一些来自第三方的POJO,它们以非常复杂的方式嵌套,我希望在使用JAXB的XML结构中使用它们。单凭这一点不会有问题。然而,这些POJO的提供者设法在继承链中的一个单独位置使用了一个接口,而不是POJO。
所以我有一个类似的简化POJO结构
POJO class A
|-- POJO class B
|-- field C is an interface of type D and not a POJO
|-- other fields of POJO types
|-- POJO class B1 etc
我打算在我的M类中使用POJO结构,如下所示:
@XmlAccessorType(XmlAccessType.FIELD)
class M
{
@XmlElementWrapper(name = "classAWrapper")
@XmlElement(name = "classA", required = true)
private List<ClassA> classAs = new ArrayList<>();
}
JAXB不喜欢带有IllegalAnnotationException和"D是一个接口,JAXB不能处理接口。">
其他解决方案,如JAXB Can';t句柄接口建议将@XmlJavaTypeAdapter(FooImpl.Adapter.class)
添加到该接口。I、 但是,不能访问接口D的源代码。
JAXB中有没有一种方法可以在某个通用位置或我的类M中告诉系统,当它遇到接口D时该怎么办(指定一个具体的类或其他什么(,这样我就可以解决这个问题了?
我在遇到XmlJavaTypeAdapters注释后找到了解决方案。
因此,如果在包some.other.impl中使用了接口D,则需要在源文件夹中创建该包,并添加一个package-info.java文件
此外,您还需要添加一个转换为D和从D转换的class DAdapter extends XMLAdapter<SurrogateForD, D>
实现,以及SurrogateForD类。
然后,在package-info.java中添加以下内容:
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters({
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value = DAdapter.class, type = D.class)
})
package some.other.impl;
JAXB在包some.other.impl中使用的任何位置遇到D时,都会使用SurrogateForD实现。
如果D在除some.other.impl之外的其他包中使用,请将该其他包添加到源文件夹中,并如上所述添加package-info.java文件(无需复制类(。