Как определить глобальный JAX-WS MessageHandler, который прозрачно передает все службы?
У нас есть набор веб-сервисов, реализованных в JAX-WS и SOAPHandler
, который добавляет атрибуты управления в заголовки SOAP.
Сегодня нам нужно добавить аннотацию @HandlerChain
в каждую новую службу, которую мы создаем.
Идея заключается в том, что разработчикам новых сервисов не нужно знать, что существует @HandlerChain
.
Есть ли способ настроить глобальный Handler
, который перехватывает все службы, запущенные в моей WAR?
Ответы
Ответ 1
Я использую Spring как веб-службу Factory Bean и определил родительский Bean следующий:
<bean id="parentWebService" abstract="true" class="org.jvnet.jax_ws_commons.spring.SpringService">
<property name="handlers">
<list>
<bean class="com.tosan.sipa.framework.webservice.handler.AuthenticationHandler"/>
</list>
</property>
</bean>
и в определении новой службы мы устанавливаем родительский элемент новой службы в родительский WebService
Ответ 2
Не проще ли было бы использовать фильтры в web.xml? Немного похоже на urlrewiter.
Ответ 3
Один из вариантов, который может работать, - aspectj. Если вы хотите использовать байткод (или в сочетании с spring), вы можете создать один обработчик как аспект и, возможно, перетащить его во все классы (и файлы WAR) через плагин maven. Я не пробовал это сам, я думаю, единственная задача - получить дескриптор заголовка SOAP с точки зрения.
Ответ 4
Я думаю, что нет никакого прямого способа сделать это. Но, присоединяясь к комментариям предварительного просмотра, возможно, вы можете создать банку со всеми своими обработчиками, а затем в каждом военном проекте определить один абстрактный класс с цепочкой, которую вы хотите, и наследовать ее в своих сервисах.
ИЛИ
Вместо того, чтобы включать WAR, попробуйте посмотреть JNDI, чтобы включить включение во время выполнения.
Ответ 5
По крайней мере, с JBoss AS и Wildfly вы можете настроить цепочки до и после обработки в конфигурации конечной точки. Например. Wildfly 8.1.0.Final standalone.xml имеет следующие настройки по умолчанию:
<subsystem xmlns="urn:jboss:domain:webservices:1.2">
<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>
<endpoint-config name="Standard-Endpoint-Config"/>
<endpoint-config name="Recording-Endpoint-Config">
<pre-handler-chain name="recording-handlers" protocol-bindings="##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM">
<handler name="RecordingHandler" class="org.jboss.ws.common.invocation.RecordingServerHandler"/>
</pre-handler-chain>
</endpoint-config>
<client-config name="Standard-Client-Config"/>
</subsystem>
Предопределенные конфигурации клиентов и конечных точек