获取JAXBElement列表,我想要一个预定义的java对象列表

时间:2015-08-25 14:16:42

标签: java soap jaxb apache-camel cxf-codegen-plugin

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

我面临的问题是当我想使用属性列表时。在这种情况下,我将始终获得一个JAXBElement列表,而不是正确类的对象。

假设这个给定的xml剪切:

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

现在所有“节点”都是AANode类型的不同域对象的ID。所以在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;

2 个答案:

答案 0 :(得分:1)

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

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

<强> binding.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>

这将解决问题

答案 1 :(得分:0)

实际上,wsdl2java生成带有错误注释的类。而不是

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

人们会期望:

@XmlIDREF
protected List<AANode> nodes;

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