我正在使用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异常数据?
答案 0 :(得分:1)
好吧,你没有直接访问真正的异常,除非你创建并抛出异常。
无论你是否使用S2异常处理处理这种情况(在这种情况下我都是“meh”),你需要将返回消息转换为对用户有价值的东西。您可以将XML转换为人类可读的内容,或者创建一个异常,捕获特定于您的应用程序的相关信息。