我和同事正在讨论这个问题,我们无法达成协议,所以我想得到你的想法.我对此有自己的看法,但我不会为你破坏它.
我应该何时返回SOAP错误,何时应返回具有错误信息的结果对象?假设这是一个可以被各种系统(.NET,Java,等等)使用的通用Web服务.结果对象将具有isError标志,errorType(类似于特定的异常类型)和消息.
有些要考虑的要点:
文章链接有效.即使听起来我想要你的意见,请坚持事实(因为y和z,x更好)
如何在JAX-WS Web服务上抛出自定义soap错误?我怎么可以指定faultCode,faultString和detailSOAP错误的?是否可以设置detailas bean 的值而不是String?
请注意,我正在使用代码优先方法开发.
我们的系统使用基于服务的WSDL生成的JAX-WS客户端存根来使用SOAP Web服务.如果出现错误,服务器返回SOAP错误,如下所示:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body>
<s:Fault>
<faultcode>SomeErrorCode</faultcode>
<faultstring xml:lang="en-US">Some error message</faultstring>
<detail>
<ApiFault xmlns="http://somenamespace.com/v1.0" xmlns:a="http://somenamespace.com/v1.0" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:RequestId>123456789</a:RequestId>
<a:CanRetry>true</a:CanRetry>
</ApiFault>
</detail>
</s:Fault>
</s:Body>
Run Code Online (Sandbox Code Playgroud)
基于WSDL SomeCustomFault生成异常类,并声明所有服务方法抛出此异常(见下文)异常.
@WebFault(name = "ApiFault", targetNamespace = "http://services.altasoft.ge/orders/v1.0")
public class SomeCustomFault
extends Exception
{
private ApiFault faultInfo;
public SomeCustomFault(String message, ApiFault faultInfo) {
super(message);
this.faultInfo = faultInfo;
}
public SomeCustomFault(String message, ApiFault faultInfo, Throwable cause) {
super(message, cause);
this.faultInfo = faultInfo;
}
public ApiFault getFaultInfo() {
return faultInfo;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,此自定义错误异常扩展Exception而非SOAPFaultException.Hovewer我需要获取SOAP …
我有一些预定义FaultContract属性的WCF服务.当FaultException<TDetail>抛出异常,他们会派堆栈跟踪,源代码和其他可能取消保存信息.
是否有可能仅返回:
为什么我可以设置faulString,但是我不能在SOAPFault中设置自定义错误代码?当我抛出异常时,文本"Code X"没有出现在SoapFaultException中.有人可以告诉我为什么?谢谢.
SOAPFault soapFault = SOAPFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL).createFault();
soapFault.setFaultString("String Y")
soapFault.setFaultCode("Code X");
throw new SOAPFaultException(soapFault);
Run Code Online (Sandbox Code Playgroud) 我正在创建一个WCF Web服务,其请求/响应应该只签名.为此,在我设置的ServiceContract属性上
ProtectionLevel = ProtectionLevel.Sign
Run Code Online (Sandbox Code Playgroud)
这没问题.
由于要求,一些SoapFaults应该从服务中抛出; 两种类型的SoapFaults:
为此,我使用处理SoafFaults的常规方法:创建一个IErrorHandler,其中使用MessageFault.CreateFault创建Message实例.
几乎所有返回的SoapFaults都没有加密(这对我来说没问题),我的问题是为什么那些行动="http://www.w3.org/2005/08/addressing/fault"或" http:// www.w3.org/2005/08/addressing/soap/fault "是加密的吗?
我试图使用一个WSDL文件调用SOAP Web服务.
我在其中添加了所有必需的参数.但我收到的错误如下:
SoapFault - faultcode: 'ns1:unexpected-error' faultstring: 'Fault occurred while processing.' faultactor: 'null' detail: null in android
Run Code Online (Sandbox Code Playgroud)
这是我的代码示例:
class RegisterMember extends AsyncTask<Void, Void, Void> {
String SOAP_ACTION = "";
String METHOD_NAME = "registerMember";
String NAMESPACE = "http://XXXXX.XX";
String URL="http://XXXX.XX?WSDL";
SoapPrimitive result1;
String str;
@Override
protected void onPreExecute() {
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setMessage("Checking For Activation");
mProgressDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
try {
StringBuffer sb;
SoapObject request=new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("name", "XXXX");
request.addProperty("email", "XXXX@gmail.com");
request.addProperty("username", "XXXXX");
request.addProperty("password", "XXXX"); …Run Code Online (Sandbox Code Playgroud) 我的Web服务方法返回一个集合对象,这将很好地序列化,这要归功于C#web服务的工作方式!
但是,如果我的代码抛出未捕获的异常,我想返回一个自定义错误对象.
这可能是使用C#ASP.NET v2吗?
例如,
正常操作应返回:
<Books>
<book>Sample</book>
<book>Sample</book>
</Books>
Run Code Online (Sandbox Code Playgroud)
但是我想要的错误
<error>
<errorMessage></errorMessage>
</error>
Run Code Online (Sandbox Code Playgroud) 我一直在使用Apache CXF wsdl2java生成的代码从web服务调用方法已经有一段时间了,到目前为止一直工作正常..我遇到的问题是当webservice(在我的大厅下面实现)合法地抛出一个soap异常,CXF出现以下错误信息:
无法初始化类com.sun.xml.internal.ws.fault.SOAPFaultBuilder
我使用的是Ubuntu 9.04,OpenJDK(IcedTea6 1.4.1)6b14-1.1.1-0ubuntu11,Maven2和CXF 2.2.3.我目前对如何解决这个问题感到茫然,因为我使用的代码和设置似乎很简单..任何人都能指出我在正确的方向吗?如果我可以发布任何进一步的细节,请告诉我..
这是返回的完整堆栈跟踪:
java.lang.NoClassDefFoundError: Could not initialize class com.sun.xml.internal.ws.fault.SOAPFaultBuilder
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:107)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
at $Proxy36.downloadPDB(Unknown Source)
at path.to.my.code.downloadInvalidFileID(SingleMethodTest.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338)
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997)
Run Code Online (Sandbox Code Playgroud) 我有一些WSDL,我需要从中生成一个Web服务实现.我正在使用Eclipse和Axis1.4,并在Weblogic9.2上运行.
生成服务器存根很好,我已经实现了我需要的代码.但是,为了兼容我们正在模拟的exising实现,我需要为某些指定的错误条件返回SOAP错误.
也就是说,我需要响应的SOAP主体看起来像这个例子:
<soapenv:Body>
<soapenv:Fault>
<faultcode xmlns:ns1="foobar">ns1:1234</faultcode>
<faultstring>The supplied parameter name ABCD is not recognised.</faultstring>
<detail>
<FaultDetail>An error processing the web service [MyService]: Unknown parameter:ABCD</FaultDetail>
<ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">planet</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
Run Code Online (Sandbox Code Playgroud)
从(很多)谷歌搜索,我想我应该能够通过抛出SOAPFaultException来做到这一点.但是消息存根只抛出java.rmi.RemoteException,所以我尝试将SOAPFaultException传递给RemoteException.这给了我这样的东西:
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>java.rmi.RemoteException: My remote exception; nested exception is:
javax.xml.rpc.soap.SOAPFaultException: soap fault string</faultstring>
<detail>
<ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">myhostname</ns1:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
Run Code Online (Sandbox Code Playgroud)
...换句话说,它没有导致SOAP错误.
我已经尝试了很多其他的东西,而且我几乎被卡住了.那么有人能告诉我(理想情况下是一个例子)如何在我的环境中返回带有我可以指定的内容的SOAP故障响应吗?
我并不喜欢使用Axis(但我对此有更多的经验).如果你建议一个替代方案,请注意我需要在Web服务方法中调用另一个(经过身份验证的)Web服务,而我只能在Axis1.4中使用它...