Как определить глобальный JAX-WS MessageHandler, который перехватывает все сервисы прозрачным способом? - PullRequest
19 голосов
/ 14 октября 2011

У нас есть набор веб-сервисов, реализованных в JAX-WS, и SOAPHandler, который добавляет атрибуты управления в заголовки SOAP.Сегодня нам нужно добавлять аннотацию @HandlerChain в каждый новый создаваемый нами сервис.

Идея состоит в том, что разработчикам новых служб не нужно знать, что существует @HandlerChain.

Есть ли способ настроить глобальный Handler, который перехватывает все службы, запущенные в моей WAR

Ответы [ 4 ]

1 голос
/ 20 сентября 2012

Один из возможных вариантов - aspectj . С помощью байт-кода (или, если хотите, в сочетании с Spring) вы можете создать отдельный обработчик как аспект и, возможно, внедрить во все классы (и файлы WAR) через плагин maven. Я сам не пробовал это, я думаю, единственной проблемой было бы получить указатель на заголовок SOAP из аспекта.

0 голосов
/ 25 ноября 2014

По крайней мере, с JBoss AS и Wildfly вы можете конфигурировать цепочки до и после обработки в конфигурации конечной точки.Например, Wildfly 8.1.0. 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>

Предопределенные конфигурации клиента и конечной точки

0 голосов
/ 25 января 2012

Я использую Spring в качестве фабричного компонента Web-сервиса и определяю родительский компонент следующим образом:

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

, а в определении нового сервиса мы только устанавливаем родителя нового сервиса в "parentWebService"

0 голосов
/ 24 октября 2011

Я думаю, что прямого пути для этого нет.Но, присоединившись к комментариям предварительного просмотра, возможно, вы сможете создать jar со всеми вашими обработчиками, а затем в каждом военном проекте определить один абстрактный класс с нужной вам цепочкой и унаследовать его в ваших сервисах.ИЛИ Вместо включения WAR, попробуйте взглянуть на JNDI, чтобы включить его во время выполнения.

...