2012-09-20 55 views
23

我使用Apache CXFcxf-codegen-pluginMaven插件生成从WSDL文件源。问题是我得到JAXBElement<String>而不是String。我已经添加了jaxb-bindings.xml文件,该文件是这样的:JAXB生成的JAXBElement <String>而不是字符串

<jaxb:bindings version="2.1" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"> 
    <jaxb:globalBindings generateElementProperty="false"/> 
</jaxb:bindings> 

这应该防止JAXB产生JAXBElement<String>。但它不起作用,我仍然生成JAXBElement<String>而不是String

Maven插件看起来是这样的:

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxf.runtime.version}</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-rt-bindings-soap</artifactId> 
      <version>${cxf.runtime.version}</version> 
     </dependency> 
    </dependencies> 
    <executions> 
     <execution> 
      <id>generate-jaxb</id> 
      <phase>generate-sources</phase> 
      <configuration> 
       <additionalJvmArgs>-Dfile.encoding=UTF8</additionalJvmArgs> 
       <wsdlOptions> 
        <wsdlOption> 
         <wsdl>src/main/resources/wsdl/Cubiks.wsdl</wsdl> 
         <extraargs> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxb-bindings.xml</extraarg> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxws-bindings.xml</extraarg> 
          <extraarg>-exsh</extraarg> 
          <extraarg>true</extraarg> 
          <extraarg>-wsdlLocation</extraarg> 
          <extraarg></extraarg> 
         </extraargs> 
        </wsdlOption> 
        <wsdlOption> 
         <wsdl>src/main/resources/wsdl/CubiksCallBackService.wsdl</wsdl> 
         <extraargs> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxws-bindings.xml</extraarg> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxb-bindings.xml</extraarg> 
          <extraarg>-exsh</extraarg> 
          <extraarg>true</extraarg> 
          <extraarg>-p</extraarg> 
          <extraarg>com.cubiks.ws.callback</extraarg> 
          <extraarg>-wsdlLocation</extraarg> 
          <extraarg></extraarg> 
         </extraargs> 
        </wsdlOption> 
       </wsdlOptions> 
      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

CXF版本2.6.0。有人知道哪里可能是问题吗?

编辑

的XSD是非常巨大的。这是产生JAXBElement<String>

<xs:complexType name="ServiceResponse"> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="RequestStatus" type="tns:RequestStatus"/> 
     <xs:element minOccurs="0" name="RequestStatusDescription" nillable="true" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:element name="ServiceResponse" nillable="true" type="tns:ServiceResponse"/> 

的元素和生成的源代码是:

@XmlElementRef(name = "RequestStatusDescription", namespace = "http://www.cubiksonline.com/2009/08/AssessmentProvider", type = JAXBElement.class) 
protected JAXBElement<String> requestStatusDescription; 
+1

Plz提供了wsdl文件,如果有,xsd – popfalushi

回答

34

我所要做的就是把jaxb:globalBindings换成另一个jaxb:bindings

<jaxb:bindings version="2.0" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"> 
    <jaxb:bindings> 
     <jaxb:globalBindings generateElementProperty="false"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

现在一切正常,没有生成JAXBElement<String>了。

+1

任何人都可以解释为什么这个工程? –

+0

很高兴在JDeveloper中报告此解决方案。只需创建一个xml文件,然后在指定WSDL的URL /位置的阶段将其传递给向导。 – webuster

+0

这也适用于NetBeans 8.2。右键单击该服务并“编辑Web服务属性”。然后转到“WSDL自定义”选项卡,并在“外部绑定文件”下的底部添加此文件并重新生成。所有字符串都以String形式解析。坦克! – Darrelk

4

我想你想你的JAXB binding.xml补充:

<jaxb:bindings ... xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"> 
    <jaxb:globalBindings generateElementProperty="false"> 
     <xjc:simple /> 
     <!-- ... --> 
    </jaxb:globalBindings> 
</jaxb:bindings> 
+0

我正在尝试添加它,但我得到:com.sun.istack.SAXParseException2:“xjc:simple”自定义与任何模式元素都没有关联。 –

+0

我已经正确设置了,但仍然一样。生成JAXBElement 。 –

+2

对,我现在已经签出了一个WS来测试,这是'generateElementProperty =“false”'属性,它避免了我的情况下的'JAXBElement'包装。对不起,噪音。 –

8

你可以我们不能一起唠叨,一起微笑。删除minoccurs因为它无论如何对字符串没有意义。

+0

为什么我不能把它们放在一起?顺便说一句,wsdl文件是由客户端提供的,我们并没有创建它。我明白他们没有意义,但它不适用于我决定删除它们。 –

+5

如果模式都有,那么您需要一个JAXBElement来区分XML元素丢失(由minOccurs允许)和存在的位置,而不是xsi:nil。如果模式只允许一个或另一个,那么你不需要JAXBElement作为'null'属性值就足够了。 –

+3

[这篇文章](http://cxf.547215.n5.nabble.com/JAXBElement-in-generated-java-classes-tp4933735p4934002.html)很好地解释了它。 –

相关问题