2011-10-14 12 views
18

Abbiamo una serie di servizi Web implementati in JAX-WS e uno SOAPHandler che aggiunge gli attributi di controllo nelle intestazioni SOAP. Oggi, dobbiamo aggiungere l'annotazione @HandlerChain in ogni nuovo servizio che creiamo.Come definire un JAX-WS globale MessageHandler che intercetta tutti i servizi in modo trasparente?

L'idea è che i nuovi implementatori di servizi non devono sapere che esiste uno @HandlerChain.

C'è un modo per configurare uno Handler globale che intercetti tutti i servizi in esecuzione nel mio WAR?

+1

iniziare una taglia appariranno forse qualche risposta. –

+0

Hai un gestore all'interno della tua GUERRA? o vuoi questo attraverso WARs o? Mi sto solo chiedendo la tua funzionalità. Tuttavia, i miei pensieri sono perché non mettere il gestore su un'interfaccia che estende l'interfaccia del tuo servizio web (o su una classe astratta che il tuo servizio estende)? –

+0

Chris, l'idea è di condividere la funzionalità del gestore in WAR, per evitare la duplicazione del codice. Quindi, l'obiettivo principale (ma non sappiamo se è possibile) è di distribuire questo gestore in un JAR, che dovrebbe essere aggiunto a ogni WEB-INF/lib di WAR o forse all'EAR finale. –

risposta

0

Penso che non ci sia un modo più preciso per farlo. Ma unendo i commenti delle anteprime, forse puoi creare un barattolo con tutti i tuoi gestori, e poi in ogni progetto di guerra, definire una classe astratta con la catena che desideri e ereditarla nei tuoi servizi. O Invece di includere WAR, prova a cercare JNDI per includere l'inclusione in runtime.

+0

João, la definizione di una classe astratta annotata solo con '@ HandlerChain' non funziona. Il gestore non viene chiamato. Se annoto la classe astratta con '@ HandlerChain' e' @ Webservice', si verifica un errore di distribuzione, dicendo che la mia classe 'FooService' che estende quella astratta non può essere castata in' javax.servlet.Servlet'. –

+0

Non riesco a vedere come includere in fase di runtime sia più flessibile o meno accoppiato rispetto all'annotazione di ogni classe di webservice con '@ HandlerChain'. –

+0

Ciao, mi scuso per il ritardo di risposta. Riguardo alle classi astratte, hai ragione che non funzionano, al momento rispondo alla domanda aveva senso che lavoro e io non testarlo, quindi per quello mi dispiace. –

1

Io uso primavera come servizio Web Factory Bean e fagioli genitore definito seguendo:

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

e nel definire il nuovo servizio abbiamo solo impostare madre di nuovo servizio di "parentWebService"

1

Non sarebbe più facile usare i filtri nel web.xml? Un po 'come fa urlrewiter.

+0

puoi per favore elaborare la tua risposta? – MaVRoSCy

+1

non è una buona risposta. –

1

Un'opzione che potrebbe funzionare è aspectj. Con la tessitura bytecode (o in combinazione con la molla, se lo desideri) puoi creare un singolo gestore come un aspetto e intrecciare tutte le classi (e anche i file WAR) attraverso il plugin Maven. Non l'ho provato da solo, credo che l'unica sfida sarebbe ottenere un handle sull'intestazione SOAP dall'aspetto.

0

Almeno con JBoss AS e Wildfly è possibile configurare catene di pre e post-handler nella configurazione di endpoint. Per esempio. standalone.xml di wildfly 8.1.0.Final ha le seguenti configurato per impostazione predefinita:

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

Predefined client and endpoint configurations

Problemi correlati