JAXB使用JAX-WS绑定生成可序列化的类

时间:2011-01-25 09:41:13

标签: java jaxb jax-ws cxf

拥有JAXB-RI和CXF。 WSDL优先。我想要一个生成的类来实现Serializable。我现在有以下绑定xml,它可以工作(SEI类名称被更改)

<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

那么,究竟如何做到

2 个答案:

答案 0 :(得分:7)

我以两种方式工作:

  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 :(得分: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());