在JAXB中,如何避免无法直接注释接口时的"interfaces not supported"异常?



我有一些来自第三方的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文件(无需复制类(。

最新更新