2011-08-10 14 views
10

Estoy usando Apache CXF para generar clases desde un archivo WSDL pero no implementan Serializable, que es necesario para poner un objeto en una cola JMS. ¿Es posible hacer esto o tengo que convertir las clases generadas en las mías y enviarlas?¿Es posible generar clases serializables con CXF?

Respuesta

13

he encontrado la solución a mí mismo por lo que aquí es si alguien lo necesita en el futuro:

1. add this plugin to pom.xml

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxf.version}</version> 
    <executions> 
     <execution> 
      <id>generate-sources</id> 
      <phase>generate-sources</phase> 
      <configuration> 
       <sourceRoot>${basedir}/src/main/java</sourceRoot> 
       <wsdlRoot>${basedir}/src/main/resources</wsdlRoot> 
       <includes> 
        <include>*Service.wsdl</include> 
       </includes> 
       <wsdlOptions> 
        <wsdlOption> 
         <wsdl>${basedir}/src/main/resources/your_wsdl.wsdl</wsdl> 
         <extraargs> 
          <extraarg>-client</extraarg> 
          <extraarg>-impl</extraarg> 
          <extraarg>-server</extraarg> 
          <extraarg>-verbose</extraarg> 
          <extraarg>-validate</extraarg> 
         </extraargs> 
         <bindingFiles> 
          <bindingFile>${basedir}/src/main/resources/binding.xml</bindingFile> 
         </bindingFiles> 
        </wsdlOption> 
       </wsdlOptions> 
      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

2. write a custom binding (binding.xml)

<?xml version="1.0" encoding="UTF-8"?> 
<jaxws:bindings wsdlLocation="Send.wsdl" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <jaxws:bindings 
     node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://wsdl/SendService.wsdl']"> 
     <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
      <jxb:serializable uid="11082011"/> 
     </jxb:globalBindings> 
    </jaxws:bindings> 
</jaxws:bindings> 

3. run 'mvn generate-sources'

+2

Tenga en cuenta que usted necesita para hacer un par de cambios en el archivo de binding.xml. 1. Cambie 'Send.wsdl' en la línea 2 a cualquier nombre que tenga su WSDL, y 2. Reemplace el atributo' node' en la línea 8 con el espacio de nombres que desee, como se sugiere [aquí] (http: // markmail. org/message/aw52wgp6bdpwo5rx) –

4

Una versión más simple de bindings.xml, que asegurarse de que todos los archivos generados están implementando Serializable:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    elementFormDefault="qualified" attributeFormDefault="unqualified" 
    jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.1"> 
    <xs:annotation> 
     <xs:appinfo> 
      <jaxb:globalBindings> 
       <xjc:serializable /> 
      </jaxb:globalBindings> 
     </xs:appinfo> 
    </xs:annotation> 
</xs:schema> 
4

archivos vinculante con < jaxws: encuadernaciones > raíz de trabajo con elemento jaxb: globalBindings sólo si su wsdl tiene un solo esquema. El problema es que jaxb: globalBindings es global, por lo que no se puede especificar más de una vez.

Si ese es su caso, puede utilizar los siguientes enlaces de archivo con JAXB: encuadernaciones:

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"> 
    <jaxb:globalBindings> 
     <jaxb:serializable uid="1"/> 
    </jaxb:globalBindings> 
</jaxb:bindings> 
Cuestiones relacionadas