在Struts2应用程序中访问WebService异常(SOAP-Fault)

时间:2011-09-24 10:38:24

标签: web-services jsp struts2

我正在使用JAX-WS开发WebService。在这个WebService中,我有一个“DatabaseQueryFault”作为SOAP-Fault:

    <wsdl:operation name="executeCustomQuery">
        <wsdl:input message="tns:executeCustomQueryRequest"></wsdl:input>
        <wsdl:output message="tns:executeCustomQueryResponse"></wsdl:output>
        <wsdl:fault name="DatabaseQueryFault" message="tns:DatabaseQueryFault"></wsdl:fault>
    </wsdl:operation>

        <xsd:element name="databaseQueryFault" type="tns:databaseQueryFault" />
        <xsd:complexType name="databaseQueryFault">
            <xsd:sequence>
                <xsd:element name="reason" type="xsd:string" minOccurs="0" />
            </xsd:sequence>
        </xsd:complexType>

实现Java方法有这个标题

public QueryResponseResultset executeCustomQuery(ExecuteCustomQuery parameters)
     throws RemoteException, DatabaseQueryFault {

每次抛出异常时,例如SQLException,我将其“转换”为DatabaseQueryFault:

    } catch (Exception e) {
        throw new DatabaseQueryFault(e.getMessage());
    }

这个工作非常好,直到这里:如果我发送一个不正确的查询,我得到一个包含DatabaseQueryFault的soap响应,包括所有数据

<soapenv>
  <soapenv:Body>
    <soapenv:Fault>
      <faultcode>soapenv:Server.generalException</faultcode>
      <faultstring></faultstring>
      <detail>
         <ns1:databaseQueryFault xmlns:ns1="http://daga/knowledgebase/webservice">          
         <reason>Unknown column 'test14' in 'field list'</reason>  
         </ns1:databaseQueryFault>
         <ns2:exceptionName xmlns:ns2="http://xml.apache.org/axis/">
             daga.knowledgebase.webservice.DatabaseQueryFault
         </ns2:exceptionName>
         <ns3:stackTrace xmlns:ns3="http://xml.apache.org/axis/">

但现在问题出现了:-)我的WebService Client是一个Struts2 Web应用程序。在那里我使用struts2(struts.xml)的本机异常处理:

<global-exception-mappings>
  <exception-mapping exception="java.lang.Exception" result="error" />
</global-exception-mappings>

现在我想在我的jsp错误页面中访问我的soap错误的详细信息,但这些字段是空的:

<p>
   <s:property value="exception" /><br />
   <s:property value="exception.message" /><br />
   <s:property value="exception.reason" />
</p>

如何在jsp文件中访问我的WebService异常数据?

1 个答案:

答案 0 :(得分:1)

好吧,你没有直接访问真正的异常,除非你创建并抛出异常。

无论你是否使用S2异常处理处理这种情况(在这种情况下我都是“meh”),你需要将返回消息转换为对用户有价值的东西。您可以将XML转换为人类可读的内容,或者创建一个异常,捕获特定于您的应用程序的相关信息。