0

我使用 Apache Camel + JAXB 进行肥皂处理。Java 眼镜是由一个名为 cxf-codegen-plugin 的 maven 插件生成的。

我面临的问题是,当我想使用一个列表属性时。在那种情况下,我总是会得到一个 JAXBElement 列表,而不是正确类的对象。

假设这个给定的 xml 被剪断:

<domainObjects avqxsi:type="avqsq:AssetAllocation" id="100" name="Some Name">
    <nodes>101</nodes>
    <nodes>102</nodes>
  </domainObjects>

现在所有“节点”都是 type 的不同域对象的 id AANode。所以在 xsd 中它是这样定义的:

<xsd:complexType name="AssetAllocation">
    <xsd:complexContent>
      <xsd:extension base="avqsq:DomainObject">
        <xsd:sequence>
          <xsd:element ecore:reference="avqsq:AANode" maxOccurs="unbounded" name="nodes" type="xsd:IDREF"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

我已经定义了一些 bindings.xml:

<jaxb:bindings node="xsd:complexType[@name='AssetAllocation']//xsd:element[@name='nodes']">
            <jaxb:property>
                <jaxb:baseType name="my.api.xsd.AANode"/>
            </jaxb:property>
        </jaxb:bindings>

我想要的是这样的 POJO 属性:

@XmlElementRef(name = "nodes")
protected List<AANode> nodes;

但是我在运行时实际得到的是List<JAXBElement<AANode>>导致 ClassCastException 的。

编辑 1: 我错过了 cxf-codegen 框架正在生成一个类的事实,您可以清楚地看到该属性被注释了JAXBElement.class,我认为这是错误的。有趣的是,手动将注释更改为 AANode.class 将失败,并出现IllegalAnnotationException: AANode" 或其任何子类在此上下文中未知。

public class AssetAllocation
    extends DomainObject
    implements Serializable, Equals, HashCode, ToString
{

    @XmlElementRef(name = "nodes", type = JAXBElement.class)
    protected List<AANode> nodes;
4

2 回答 2

1

apache CXF 代码生成插件将始终使用 JAXBElement 生成代码,直到您设置生成元素属性标志。

请创建 Jaxb binding.xml 并在 pom 文件中的代码生成插件部分中引用该绑定 xml,如下所示

绑定.xml

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="2.0"
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
    <jaxb:bindings>
        <jaxb:globalBindings generateElementProperty="false"/>
    </jaxb:bindings>
</jaxb:bindings>

代码生成插件

<plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                        <configuration>
                            <wsdlOptions>
                                <wsdlOption>
                                    <wsdl>${basedir}/src/main/resources/META-INF/wsdl/CxfExampleService.wsdl</wsdl>
                                    <bindingFiles>
                                        <bindingFile>${basedir}/src/main/resources/META-INF/wsdl/binding/bindings.xml</bindingFile>
                                    </bindingFiles>                                 
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

这将解决问题

于 2015-08-26T14:17:48.367 回答
0

事实上,wsdl2java 会生成带有错误注释的类。代替

@XmlElementRef(name = "nodes", type = JAXBElement.class)
protected List<AANode> nodes;

人们期望拥有:

@XmlIDREF
protected List<AANode> nodes;

我无法通过 bindings.xml 来管理它。所以我的最终解决方案是我使用字节码操作来修复注释。这样我就不必弄乱生成的类或生成器本身。

于 2015-09-08T15:18:21.960 回答