2011-10-14 20 views
18

我們在JAX-WS和一個SOAPHandler中實現了一組Web服務,這些服務在SOAP標頭中添加了控件屬性。 今天,我們需要在我們創建的每個新服務中添加@HandlerChain註釋。如何定義以透明方式攔截所有服務的全局JAX-WS MessageHandler?

這個想法是,新的服務實現者不需要知道存在@HandlerChain

有沒有辦法配置攔截WAR中運行的所有服務的全局Handler

+1

開始賞金也許有些答案會出現。 –

+0

你的WAR中是否有處理程序?或者你想要通過WAR還是?我只是想知道你的功能。我的想法是爲什麼不把處理程序放在你的Web服務接口擴展的接口上(或者你的服務擴展的抽象類)? –

+0

Chris的想法是跨WAR分享處理函數,以避免代碼重複。所以,主要目標(但我們不知道是否有可能)是將這個處理程序分發到一個JAR中,該JAR應該被添加到每個WAR的WEB-INF/lib目錄或者最終的EAR中。 –

回答

0

我認爲沒有海峽前進的方式來做到這一點。但加入預覽評論,也許你可以用你的所有處理程序創建一個jar,然後在每個戰爭項目中,用你想要的鏈定義一個抽象類,並在你的服務中繼承它。 或 除了包含WAR之外,請嘗試查看JNDI以在運行時創建包含。

+0

若昂,定義一個只有'@ HandlerChain'註解的抽象類不起作用。處理程序不被調用。如果我用'@ HandlerChain'和'@ Webservice'註解抽象類,會發生部署錯誤,並說我的'FooService'類擴展了抽象類,不能轉換爲'javax.servlet.Servlet'。 –

+0

我看不到在運行時如何包含比'@ HandlerChain'註釋每個webservice類更靈活或更少的耦合。 –

+0

嗨,抱歉,延遲迴答。 關於抽象類,你是對的,他們不工作,現在我回答了這個問題,它使工作變得有意義,我不測試它,所以抱歉。 –

1

我使用Spring作爲Web服務的工廠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> 

,並確定新的服務,我們只有新服務的設置父「parentWebService」

1

豈不是更簡單的只是在web.xml中使用過濾器?有點像urlrewiter呢。

+0

你能否詳細說明你的答案? – MaVRoSCy

+1

不是一個好的答案。 –

1

可能有效的一個選項是aspectj。使用字節碼編織(或者如果你願意,可以與spring一起使用),你可以創建一個單一的處理器作爲一個方面,並且可能通過Maven插件編織到所有的類(以及WAR文件)。我自己沒有嘗試過這個,我猜想唯一的挑戰就是從這個方面獲得SOAP頭的句柄。

0

至少在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> 

Predefined client and endpoint configurations