【问题标题】:Jaxb2Marshaller subclasses scanningJaxb2Marshaller 子类扫描
【发布时间】:2020-09-01 10:55:39
【问题描述】:

我正在使用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 类?

【问题讨论】:

    标签: java jaxb spring-oxm


    【解决方案1】:

    原因是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)@XmlType 在子类中仍然有效 - 在我的示例中,该字段应该是可见的,或者您可以使用 XmlAccessType.PUBLIC_MEMBER 将定义更改为 getter 方法

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

    【讨论】:

      猜你喜欢
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多