我有SEI类,它抛出在WSDL文件中声明的异常。在处理抛出此异常的过程中,SOAP Fault会成功发送到客户端。这里没有问题。 但是,当我们在处理过程中遇到服务器中的任何运行时异常时,我们会创建一个自定义Fault并从SEI类中抛出相同的错误。 由于此自定义错误未在SEI中声明,因此我们添加了Fault Class以扩展RuntimeException。但是,从应用程序代码中抛出此自定义错误时,Websphere应用程序服务器不会将SOAP错误返回给客户端。相反,它会抛出异常并将Http错误代码500发送到客户端。 有没有办法将自定义错误消息发送到客户端而不在WSDL中声明相同。
我的WebMethod:
public CustomerDetails enquireCustomer(Customer customer)
throws CustomerFault
{
try
{
// SOME LOGIC HERE
}
catch (Exception exception)
{
if (exception instanceof CustomerFault)
throw ((CustomerFault) exception );
if (localException instanceof CustomerFault)
{
FaultDetails faultDetails = new FaultDetails();
faultDetails.setErrorId(1);
faultDetails.setErrorDescription(errorDescription);
throw new CustomerFault("Failed in Processing and other details here... ", faultDetails);
}
}
}
我的错误类
import javax.xml.ws.WebFault;
@WebFault(name="CustomerFault", targetNamespace="http://www.mycompany.com")
public class CustomerFault extends RuntimeException
{
private static final long serialVersionUID = 1L;
private FaultDetails faultDetails;
public ServiceExecutionFault(String message, FaultDetails faultDetails) {
super(message);
this.faultDetails = faultDetails;
}
public ServiceExecutionFault(String message)
{
super(message);
}
public ServiceExecutionFault(String message, FaultDetails faultDetails,
Throwable cause) {
super(message, cause);
this.faultDetails = faultDetails;
}
public FaultDetails getFaultInfo() {
return faultDetails;
}
}
这个问题似乎只存在于Websphere中。在weblogic中尝试时,同样正常工作没有任何问题。我在这里缺少任何标准。
答案 0 :(得分:1)
在这里找到答案:
JAX-WS server-side SOAPHandler that returns fault gets "Internal Error" on WebSphere v8
通过禁用websphere中的统一故障处理,这很好用。 添加以下JVM属性。
-Dwebservices.unify.faults=false
可以从管理控制台设置:
服务器 - >服务器类型 - > Websphere Application Server - >处理 定义 - > Java虚拟机 - >自定义属性