0

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 (v5.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 类?

4

1 回答 1

0

原因是 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
}

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

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

于 2020-09-01T16:31:34.853 回答