2012-09-20 65 views
23

estoy usando Apache CXFcxf-codegen-pluginMaven plugin para generar fuentes de WSDL archivo. El problema es que obtengo JAXBElement<String> generado en lugar de String. He añadido el archivo jaxb-bindings.xml que se parece a esto:JAXB generar JAXBElement <String> en lugar de cuerdas

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

Esto debería evitar JAXB para generar JAXBElement<String>. Pero no funciona, todavía tengo JAXBElement<String> generado en lugar de String.

Mi Maven complemento se ve así:

<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 versión es 2.6.0. ¿Alguien sabe dónde podría estar el problema?

EDITAR

El XSD es muy grande. Este es el elemento que genera 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"/> 

Y la fuente generado es:

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

Plz proporciona el archivo wsdl y, si lo tiene, xsd – popfalushi

Respuesta

34

Lo que tuve que hacer es envolver jaxb:globalBindings con otro 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> 

Ahora todo está funcionando, no hay JAXBElement<String> generado más.

+1

¿Alguien puede explicar por qué esto funciona? –

+0

Feliz de informar que esta solución también funciona en JDeveloper. Simplemente cree un archivo xml y páselo en el asistente en la fase en que especifica la URL/ubicación del WSDL. – webuster

+0

Esto también funcionó en NetBeans 8.2. Haga clic derecho en el servicio y "edite los atributos del servicio web". A continuación, vaya a la pestaña "Personalización de WSDL" y en la parte inferior de "Archivos de enlace externo" añada este archivo y vuelva a generarlo. Todas las cadenas resueltas como String. Tanques! – Darrelk

4

creo que desea agregar en su 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

Estoy tratando de agregarlo pero estoy obteniendo: com.sun.istack.SAXParseException2: La personalización "xjc: simple" no está asociada con ningún elemento de esquema. –

+0

He logrado correctamente pero sigue igual. Se genera JAXBElement . –

+2

Bien, ahora he comprobado un WS para probar, es el atributo 'generateElementProperty =" false "' que evita el envoltorio 'JAXBElement' en mi caso. Perdón por el ruido. –

8

Puede No tienen nillable y minoccurs juntos. Elimine los minoccurses ya que no tiene sentido para las cadenas de todos modos.

+0

¿Y por qué no puedo tenerlos juntos? Por cierto, el cliente proporciona el archivo wsdl, no lo creamos. Entiendo que no tienen sentido, pero no me corresponde a mí decidir eliminarlos o no. –

+5

Si el esquema tiene ambos, entonces necesita un JAXBElement para poder distinguir entre los casos donde falta el elemento XML (permitido por minOccurs) y donde está presente, pero 'xsi: nil'. Si el esquema solo permitía uno u otro, entonces no necesitaría el JAXBElement ya que un valor de propiedad 'null' sería suficiente. –

+3

[Esta publicación] (http://cxf.547215.n5.nabble.com/JAXBElement-in-generated-java-classes-tp4933735p4934002.html) lo explica muy bien. –

Cuestiones relacionadas