我們在JAX-WS和一個SOAPHandler
中實現了一組Web服務,這些服務在SOAP標頭中添加了控件屬性。 今天,我們需要在我們創建的每個新服務中添加@HandlerChain
註釋。如何定義以透明方式攔截所有服務的全局JAX-WS MessageHandler?
這個想法是,新的服務實現者不需要知道存在@HandlerChain
。
有沒有辦法配置攔截WAR中運行的所有服務的全局Handler
?
我們在JAX-WS和一個SOAPHandler
中實現了一組Web服務,這些服務在SOAP標頭中添加了控件屬性。 今天,我們需要在我們創建的每個新服務中添加@HandlerChain
註釋。如何定義以透明方式攔截所有服務的全局JAX-WS MessageHandler?
這個想法是,新的服務實現者不需要知道存在@HandlerChain
。
有沒有辦法配置攔截WAR中運行的所有服務的全局Handler
?
我認爲沒有海峽前進的方式來做到這一點。但加入預覽評論,也許你可以用你的所有處理程序創建一個jar,然後在每個戰爭項目中,用你想要的鏈定義一個抽象類,並在你的服務中繼承它。 或 除了包含WAR之外,請嘗試查看JNDI以在運行時創建包含。
若昂,定義一個只有'@ HandlerChain'註解的抽象類不起作用。處理程序不被調用。如果我用'@ HandlerChain'和'@ Webservice'註解抽象類,會發生部署錯誤,並說我的'FooService'類擴展了抽象類,不能轉換爲'javax.servlet.Servlet'。 –
我看不到在運行時如何包含比'@ HandlerChain'註釋每個webservice類更靈活或更少的耦合。 –
嗨,抱歉,延遲迴答。 關於抽象類,你是對的,他們不工作,現在我回答了這個問題,它使工作變得有意義,我不測試它,所以抱歉。 –
我使用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」
可能有效的一個選項是aspectj。使用字節碼編織(或者如果你願意,可以與spring一起使用),你可以創建一個單一的處理器作爲一個方面,並且可能通過Maven插件編織到所有的類(以及WAR文件)。我自己沒有嘗試過這個,我猜想唯一的挑戰就是從這個方面獲得SOAP頭的句柄。
至少在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>
開始賞金也許有些答案會出現。 –
你的WAR中是否有處理程序?或者你想要通過WAR還是?我只是想知道你的功能。我的想法是爲什麼不把處理程序放在你的Web服務接口擴展的接口上(或者你的服務擴展的抽象類)? –
Chris的想法是跨WAR分享處理函數,以避免代碼重複。所以,主要目標(但我們不知道是否有可能)是將這個處理程序分發到一個JAR中,該JAR應該被添加到每個WAR的WEB-INF/lib目錄或者最終的EAR中。 –