2011-01-25 15 views
9

Tener JAXB-RI y CXF. WSDL primero. Quiero una clase generada de minas para implementar Serializable. Ahora tengo el siguiente código XML de unión, que funciona (el nombre de clase SEI se cambia)Clases generadas JAXB serializables con enlace JAX-WS

<jaxws:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" ...> 
    <bindings node="wsdl:definitions/wsdl:portType[@name='Foo']"> 
     <!-- change the generated SEI class --> 
     <class name="IFooService" /> 
    </bindings> 
</jaxws:bindings> 

No, en este contexto, dónde y qué debo añadir. Probé:

<xsd:annotation> 
    <xsd:appinfo> 
     <jaxb:globalBindings> 
      <xjc:serializable uid="12343" /> 
     </jaxb:globalBindings> 
    </xsd:appinfo> 
</xsd:annotation> 

y

<jxb:globalBindings> 
    <jxb:serializable/> 
</jxb:globalBindings> 

tanto dentro como fuera de la etiqueta <bindings> - o bien no se añade Serializable, o clases no se generan en absoluto (sin ningún error).

Ver también this thread

Así que, ¿cómo es exactamente que hacer que

+0

JAXB personalizaciones de enlace son un verdadero dolor en el cuello Son una resaca de los malos tiempos de JAXB 1.x, y nunca fueron rediseñados adecuadamente para 2.x. – skaffman

+0

posible duplicado de [¿Cómo generar una clase Java que implemente la interfaz Serializable desde xsd usando JAXB?] (Http://stackoverflow.com/questions/1513972/how-to-generate-a-java-class-whichimplements- serializable-interface-from-xsd-usi) –

Respuesta

6

hice funcionar de dos maneras:

  1. El uso de un segundo archivo de unión, que es JAXB-solamente, ya el que Pascal mostró en his answer

  2. Al especificar otra etiqueta <bindings> que maneja el nombre completo el espacio:

    <bindings 
        node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://www.yoursite.com/services/mynamespace']"> 
        <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
         xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
         <jxb:serializable /> 
        </jxb:globalBindings> 
    </bindings> 
    
+0

¿Puedes ampliar estos? Para # 1, ¿cómo pasas el segundo archivo a 'wsimport'? Para # 2 donde en el '' ¿esto va y es 'jaxws' el espacio de nombres predeterminado en tu ejemplo? – OrangeDog

1

Se puede implementar un plugin XJC de hacer eso:

public class SerializablePlugin extends Plugin 
{ 

    @Override 
    public boolean run(Outline outline, Options options, ErrorHandler errorHandler) throws SAXException 
    { 
    for (ClassOutline classOutline : outline.getClasses()) 
    { 
    JDefinedClass definedClass = classOutline.implClass; 
    definedClass._implements(codeModel.ref(Serializable.class)); 
    } 
    return true; 
    } 

... 
} 

A continuación, puede agregar el complemento a las opciones SchemaCompiler:

WsimportOptions wsimportOptions = new WsimportOptions(); 
wsimportOptions.getSchemaCompiler().getOptions().activePlugins.add(new SerializablePlugin()); 
Cuestiones relacionadas