我创建了一个Web服务,并使用Axis2生成所有“骨架”java类。然后我当然自己实施了服务操作。
在实现中,我可以抛出一个MyException,然后由生成的类捕获并转换为AxisFault对象,而AxisFault对象又转换为soap fault(在Axis框架的内部),属性为{{1 }}
我的问题是我想要一个自定义动态故障代码,而不是“soapenv:Server”。
我试图手动创建一个AxisFault对象并抛出它,但是AxisFault是一个RemoteException,我实现必须实现的生成的接口不允许抛出RemoteException。
是否可以在输出上获得某种钩子或过滤器,以便我可以更改故障码?或者以其他方式控制故障码?
提前致谢
Ulrik合作
答案 0 :(得分:4)
SOAP specification描述了详细信息标记下自定义错误信息的显示方式。 faultcode 是一组固定的值,用于处理SOAP处理中抛出错误的位置。
以下是抛出自定义错误消息的示例
声明WSDL中的错误,以便生成关联的类:
<wsdl:definitions targetNamespace="http://example"
xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:tns="http://example"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://example"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:tns="http://example" xmlns:intf="http://example"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<element name="withdraw">
<complexType>
<sequence>
<element name="account" type="xsd:string"/>
<element name="amount" type="xsd:int"/>
</sequence>
</complexType>
</element>
<element name="withdrawResponse">
<complexType>
<sequence>
<element name="balance" type="xsd:int"/>
</sequence>
</complexType>
</element>
<element name="AccountNotExistFault">
<complexType>
<sequence>
<element name="account" type="xsd:string"/>
</sequence>
</complexType>
</element>
<element name="InsufficientFundFault">
<complexType>
<sequence>
<element name="account" type="xsd:string"/>
<element name="balance" type="xsd:int"/>
<element name="requestedFund" type="xsd:int"/>
</sequence>
</complexType>
</element>
</schema>
</wsdl:types>
<wsdl:message name="withdrawRequest">
<wsdl:part element="tns:withdraw" name="parameters"/>
</wsdl:message>
<wsdl:message name="withdrawResponse">
<wsdl:part element="tns:withdrawResponse" name="return"/>
</wsdl:message>
<wsdl:message name="InsufficientFundFaultMessage">
<wsdl:part element="tns:InsufficientFundFault" name="fault"/>
</wsdl:message>
<wsdl:message name="AccountNotExistFaultMessage">
<wsdl:part element="tns:AccountNotExistFault" name="fault"/>
</wsdl:message>
<wsdl:portType name="Bank">
<wsdl:operation name="withdraw">
<wsdl:input message="tns:withdrawRequest" name="withdrawRequest"/>
<wsdl:output message="tns:withdrawResponse" name="withdrawResponse"/>
<wsdl:fault message="tns:AccountNotExistFaultMessage" name="AccountNotExistException"/>
<wsdl:fault message="tns:InsufficientFundFaultMessage" name="InsufficientFundException"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="BankSoapBinding" type="tns:Bank">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="withdraw">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="withdrawRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="withdrawResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="InsufficientFundException">
<wsdlsoap:fault name="InsufficientFundException" use="literal"/>
</wsdl:fault>
<wsdl:fault name="AccountNotExistException">
<wsdlsoap:fault name="AccountNotExistException" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="BankService">
<wsdl:port binding="tns:BankSoapBinding" name="Bank">
<wsdlsoap:address location="http://localhost:8080/bank/services/Bank"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
以下代码演示了如何抛出自定义错误消息:
package example;
public class BankServiceSkeleton {
public WithdrawResponse withdraw(Withdraw param1) throws InsufficientFundFaultMessage, AccountNotExistFaultMessage {
//
// Parameter handling
//
String account = param1.getAccount();
int amount = param1.getAmount();
//
// Error checks
//
if ("13".equals(account)) {
AccountNotExistFault fault = new AccountNotExistFault();
fault.setAccount(account);
AccountNotExistFaultMessage ex = new AccountNotExistFaultMessage("Account does not exist!");
ex.setFaultMessage(fault);
throw ex;
}
if (amount > 1000) {
InsufficientFundFault fault = new InsufficientFundFault();
fault.setAccount(account);
fault.setBalance(1000);
fault.setRequestedFund(amount);
InsufficientFundFaultMessage ex = new InsufficientFundFaultMessage("Insufficient funds");
ex.setFaultMessage(fault);
throw ex;
}
//
// Normal response
//
WithdrawResponse response = new WithdrawResponse();
response.setBalance(1000 - amount);
return response;
}
}
以下SOAP消息
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:exam="http://example">
<soapenv:Header/>
<soapenv:Body>
<exam:withdraw>
<exam:account>10</exam:account>
<exam:amount>2000</exam:amount>
</exam:withdraw>
</soapenv:Body>
</soapenv:Envelope>
生成以下SOAP错误响应
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>Insufficient funds</faultstring>
<detail>
<ns1:InsufficientFundFault xmlns:ns1="http://example">
<ns1:account>10</ns1:account>
<ns1:balance>1000</ns1:balance>
<ns1:requestedFund>2000</ns1:requestedFund>
</ns1:InsufficientFundFault>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>