2014-03-27 33 views
0

我們有一個使用Axis 1.4接收SOAP調用的遺留Web服務。目前,web.xml中的servlet映射使用url-pattern /services/*,因此services下的任何內容都將映射到AxisServlet。我們的WSDD文件看起來是這樣的:Axis自定義處理程序未運行wsdl

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 

<service name="MyService" provider="java:RPC"> 
    <parameter name="allowedMethods" value="*"/> 
    <parameter name="className" value="com.foo.MyService"/> 
    <wsdlFile>path/to/wsdl.wsdl</wsdlFile> 
</service> 

<transport name="http"> 
    <requestFlow> 
    <handler type="java:org.apache.axis.handlers.http.URLMapper"/> 
    <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> 
    </requestFlow> 
</transport> 

<globalConfiguration> 
    <requestFlow> 
    <handler type="java:com.foo.AxisRequestHandler"/> 
    </requestFlow> 
    <responseFlow> 
    <handler type="java:com.foo.AxisResponseHandler"/> 
    </responseFlow> 
</globalConfiguration> 

</deployment> 

我們現在不再想services下的一切去軸,只有services/MyService這樣我們就可以services下使用其他技術的其他請求。

因此,我將wx AxisServlet的web.xml url-pattern更改爲services/MyService。然後,我想從wsdd中刪除URLMapper,並讓我的AxisRequestHandler將所有請求發送到MyService。因此,WSDD現在看起來是這樣的:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 

<service name="MyService" provider="java:RPC"> 
    <parameter name="allowedMethods" value="*"/> 
    <parameter name="className" value="com.foo.MyService"/> 
    <wsdlFile>path/to/wsdl.wsdl</wsdlFile> 
</service> 

<transport name="http"> 
    <requestFlow> 
    <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> 
    </requestFlow> 
</transport> 

<globalConfiguration> 
    <requestFlow> 
    <handler type="java:com.foo.AxisRequestHandler"/> 
    </requestFlow> 
    <responseFlow> 
    <handler type="java:com.foo.AxisResponseHandler"/> 
    </responseFlow> 
</globalConfiguration> 

</deployment> 

而在AxisRequestHandler我有這樣的:

public void invoke(MessageContext context) throws AxisFault 
{ 
    context.setTargetService("MyService"); 
} 

實際進行SOAP調用時,這一切的偉大工程。然而,當我去到/services/MyService?wsdl服務器最多的WSDL文件,我得到以下錯誤:

error

我已經把調試日誌在AxisRequestHandler,每當我打的WSDL,它永遠不會打我處理程序。有什麼我在這裏失蹤?

回答

0

在通過Axis代碼調試一段時間後,我發現處理程序有一個generateWSDL方法。我說這AxisRequestHandler

public void generateWSDL(MessageContext context) throws AxisFault 
{ 
    context.setTargetService("MyService"); 
} 

,此方法被擊中/services/MyService?wsdl時調用,從而導致正確的服務進行設置。