Сгенерированные JAXB классы, сериализуемые с привязкой JAX-WS - PullRequest
9 голосов
/ 25 января 2011

Наличие 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 не добавляется, либо классы не создаются вообще (безошибка).

См. также эту тему

Итак, как именно это сделать

Ответы [ 2 ]

7 голосов
/ 25 января 2011

Я заставил это работать двумя способами:

  1. Использование второго файла привязки, который только для JAXB, как тот, который Паскаль показал в его ответ

  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 голос
/ 25 января 2011

Вы можете реализовать плагин 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());
...