2011-01-25 11 views
9

Posiadające JAXB-RI i CXF. Najpierw WSDL. Chcę, aby moja generowana klasa implementowała Serializable. Mam teraz następujące wiązania XML, który działa (nazwa klasy SEI zostaje zmieniona)JAXB generowane klasy serializowalne z wiązaniem 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, w tym kontekście, gdzie i co mam dodać. Próbowałem:

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

i

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

zarówno wewnątrz jak i na zewnątrz tagu <bindings> - albo Serializable nie dodaje, ani klasy nie są generowane w ogóle (bez błędu).

Zobacz także this thread

Tak, jak dokładnie to zrobić

+0

JAXB dostosowania wiążące to prawdziwy ból w szyi. Oni są kacem ze złych, starych czasów JAXB 1.x i nigdy nie został on właściwie zmieniony na 2.x. – skaffman

+0

możliwy duplikat [Jak wygenerować klasę Java, która implementuje interfejs Serializable z xsd przy użyciu JAXB?] (Http://stackoverflow.com/questions/1513972/how-to-generate-a-java-class-which-implements- serializable-interface-from-xsd-usi) –

Odpowiedz

6

Zrobiłem to działa na dwa sposoby:

  1. Korzystanie z drugiego pliku wiązania, który jest JAXB tylko, jak ten Pascal pokazał w his answer

  2. Podając inny znacznik <bindings>, który obsługuje całą nazwę Powierzchnia:

    <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

Czy możesz rozwinąć te? Dla # 1 jak przekazujesz drugi plik do 'wsimport'? Dla # 2 gdzie w '' to idzie i jest 'jaxws' domyślną przestrzenią nazw w twoim przykładzie? – OrangeDog

1

można zaimplementować wtyczkę XJC to zrobić:

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; 
    } 

... 
} 

Następnie, można dodać plugin do opcji SchemaCompiler:

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