2011-01-25 73 views
9

具有JAXB-RI和CXF。首先WSDL。我想要一個生成的類來執行Serializable。我現在有以下XML綁定,這將工作(SEI類名得到改變)JAXB生成的類可以使用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> 

沒有,在這種情況下,在那裏和我要補充。我想:

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

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

內部和<bindings>標籤外 - 不添加任一Serializable,或根本不產生類(沒有任何錯誤)。

又見this thread

那麼,究竟如何做到這一點

+0

JAXB綁定自定義是一個真正的脖子痛。它們是JAXB 1.x糟糕的舊時代的宿醉,並且它從未針對2.x進行過適當的重新設計。 – skaffman 2011-01-25 09:54:20

+0

可能的重複[如何使用JAXB生成從xsd實現Serializable接口的Java類?](http://stackoverflow.com/questions/1513972/how-to-generate-a-java-class-which-implements- serializable-interface-from-xsd-usi) – 2011-01-25 09:56:40

回答

6

我把它在兩個方面的工作:

  1. 使用第二裝訂文件,它是JAXB只,如一個Pascal顯示在his answer

  2. 通過指定另一個<bindings>標記來處理整個名稱空間:

    <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> 
    
1

您可以實現的XJC插件來做到這一點:

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

... 
} 

然後,您可以將插件添加到SchemaCompiler選項:

WsimportOptions wsimportOptions = new WsimportOptions(); 
wsimportOptions.getSchemaCompiler().getOptions().activePlugins.add(new SerializablePlugin()); 
相關問題