Java Jaxb2Marshaller子类扫描

Java Jaxb2Marshaller子类扫描,java,jaxb,spring-oxm,Java,Jaxb,Spring Oxm,我正在使用maven-jaxb2-plugin根据WSDL生成Java类。 生成的Java类位于包com.myapp.Generated下,例如,有一个Jaxb2生成的类com.myapp.Generated.SomeRequest: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "someRequestType" }) @XmlRootElement

我正在使用
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
}
@Bean
public Jaxb2Marshaller marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("com.myapp.extended.*");
    return marshaller;
}
然后使用SpringBoot(v2.2.9)/SpringOXM(v5.2.8),我为Jaxb2Marshaller指定Bean来扫描该包:

package com.myapp.extended.someRequest;
class SomeRequestExtended extends com.myapp.generated.SomeRequest {
 // additional code
}
@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注释:

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
}
还要确保
@xmlacessortype(xmlacesstype.FIELD)
@XmlType
在子类中仍然有效-在我的示例中,该字段应该是可见的,或者您可以使用
xmlacesstype.PUBLIC\u成员将定义更改为getter方法

提示:此外,如果存在且通常存在由JAXB生成的文件
package info.java
,则还应将其复制到新的包中,如我的示例中所示:
package com.myapp.extended.someRequest如果没有,则marshaller解析类时可能会出现问题