Java 在JAXB中,如何避免;“不支持接口”;无法直接注释接口时出现异常?

Java 在JAXB中,如何避免;“不支持接口”;无法直接注释接口时出现异常?,java,jaxb,Java,Jaxb,我有一些来自第三方的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 clas

我有一些来自第三方的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<>();
}
@xmlacessortype(xmlacesstype.FIELD)
M类
{
@xmlementwrapper(name=“classAWrapper”)
@xmlement(name=“classA”,required=true)
private List classAs=new ArrayList();
}
JAXB不喜欢它带有IllegaAnnotationException,并且“D是一个接口,JAXB不能处理接口。”

其他解决方案如建议向接口添加
@XmlJavaTypeAdapter(FooImpl.Adapter.class)
。一、 但是,您无法访问接口D的源代码


在JAXB中有没有一种方法可以告诉系统在遇到接口D(指定一个具体的类或其他东西)时在某个通用点或在我的类M中该怎么做,这样我就可以解决这个问题?

在遇到XmlJavaTypeAdapters注释后,我找到了解决方案

因此,如果在包some.other.impl中使用接口D,则需要在源文件夹中创建该包,并添加一个package-info.java文件。
此外,您还需要添加一个
类DAdapter extensed XMLAdapter
实现,该实现可以与D以及代理ford类进行转换

然后,在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时,它将使用代理ford实现。
如果D在包some.other.impl之外的其他包中使用,请将该其他包添加到源文件夹中,并如上所述添加package-info.java文件(无需复制类)