JAXB генерируемые классы сериализуемые с привязкой JAX-WS
имея 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>
tag-либо Serializable
не добавляется, или классы не генерируются вообще (без каких-либо ошибок).
Смотрите также этой теме
Итак, как именно это сделать
2 ответов
Я заставил его работать двумя способами:
используя второй файл привязки, который является только JAXB, как показал Паскаль в ответ
-
, указав другой
<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>
вы можете реализовать плагин 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());