Jaxb2Marshaller子类扫描



我使用maven-jaxb2-plugin根据WSDL生成Java类。生成的Java类在包com.myapp.generated下,例如,有Jaxb2生成的类com.myapp.generated.SomeRequest:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"someRequestType"
})
@XmlRootElement(name = "someRequest")
public class SomeRequest
{
// generated code
}

我正在扩展它,然后我把它放在一个不同的包中:

package com.myapp.extended.someRequest;
class SomeRequestExtended extends com.myapp.generated.SomeRequest {
// additional code
}

然后使用Spring Boot(v2.2.9(/Spring oxm(v.2.8(,我为Jaxb2Marshaller指定Bean来扫描该包:

@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setPackagesToScan("com.myapp.extended.*");
return marshaller;
}

不幸的是,在运行时,它没有发现一个问题:

class package com.myapp.extended.someRequest.SomeRequestExtended; nor any of its super class is known to this context.
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:567) ~[na:1.8.0_201]
...

有人知道原因是什么吗?以及如何让它扫描指定的包来找到SomeRequestExtended类?

原因是JAXB类上所需的XmlRootElement未在子类中继承,因为接口XmlRootElement没有@inherited annotation:

package javax.xml.bind.annotation;
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
public @interface XmlRootElement {
java.lang.String namespace() default "##default";
java.lang.String name() default "##default";
}

为了解决这个问题,您可以手动将它从父类添加/复制到子类:

package com.myapp.extended.someRequest;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"someRequestType"
})
@XmlRootElement(name = "someRequest")
class SomeRequestExtended extends com.myapp.generated.SomeRequest {
// additional code
}

还要确保@XmlAccessorType(XmlAccessType.FIELD)@XmlType在子类中仍然有效——在我的示例中,字段应该是可见的,或者您可以使用XmlAccessType.PUBLIC_MEMBER将定义更改为getter方法

提示:此外,如果存在并且通常存在JAXB生成的文件package-info.java,那么它也应该被复制到一个新的包中,就像我的示例中的:package com.myapp.extended.someRequest;如果没有,则在通过marshaller解析类时可能会出现问题

相关内容

  • 没有找到相关文章

最新更新