返回fault gets“的JAX-WS服务器端SOAPHandler;“内部错误”;在WebSphereV8上

返回fault gets“的JAX-WS服务器端SOAPHandler;“内部错误”;在WebSphereV8上,soap,websphere,jax-ws,websphere-8,Soap,Websphere,Jax Ws,Websphere 8,我有一个服务器端JAX-WSSOAPHandler(在WebSphereV8上),在某些情况下,它需要使用字符串变量中的SOAP响应响应客户端(我们称之为responseXml) 当responseXml包含成功(即非故障)的SOAP消息时,JAX-WS会将响应正确地发送到客户端。但是,当responseXml包含SOAP错误消息时,会发生“内部错误”,并且客户端得到的错误响应与responseXml中的不同,如下所示: <soapenv:Envelope xmlns:soapenv="h

我有一个服务器端JAX-WS
SOAPHandler
(在WebSphereV8上),在某些情况下,它需要使用字符串变量中的SOAP响应响应客户端(我们称之为
responseXml

responseXml
包含成功(即非故障)的SOAP消息时,JAX-WS会将响应正确地发送到客户端。但是,当
responseXml
包含SOAP错误消息时,会发生“内部错误”,并且客户端得到的错误响应与
responseXml
中的不同,如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <soapenv:Fault xmlns:axis2ns1="http://schemas.xmlsoap.org/soap/envelope/">
         <faultcode>axis2ns1:Server</faultcode>
         <faultstring>Internal Error</faultstring>
         <detail/>
      </soapenv:Fault>
   </soapenv:Body>
</soapenv:Envelope>
下面是一个简化的
SOAPHandler
,它说明了这个问题。(请注意,此处显示的
responseXml
的值只是一个示例。在我实际的
SOAPHandler
中,响应不是硬编码的,而是从数据库中读取的。我只是尝试显示尽可能简单的示例代码。)

package simplified.demo;
导入java.io.ByteArrayInputStream;
导入java.util.Set;
导入javax.xml.namespace.QName;
导入javax.xml.soap.MessageFactory;
导入javax.xml.soap.SOAPMessage;
导入javax.xml.ws.handler.MessageContext;
导入javax.xml.ws.handler.soap.SOAPHandler;
导入javax.xml.ws.handler.soap.SOAPMessageContext;
公共类FaultyHandler实现了SOAPHandler{
@凌驾
公共布尔handleMessage(SOAPMessageContext上下文){
Boolean outbound=(Boolean)context.get(MessageContext.MESSAGE\u outbound\u属性);
如果(!出站){
String responseXml=“soapenv:ServerORA-01031:权限不足”;
试一试{
SOAPMessage newMsg=createSOAPMessage(responseXml);
setMessage(newMsg);
}捕获(例外e){
抛出新的运行时异常(e);
}
}
返回(出境);
}
专用SOAPMessage createSOAPMessage(字符串响应XML){
试一试{
ByteArrayInputStream in=新的ByteArrayInputStream(responseXml.getBytes());
MessageFactory MessageFactory=MessageFactory.newInstance();
return messageFactory.createMessage(null,in);
}捕获(例外e){
抛出新的运行时异常(e);
}
}
@凌驾
公共布尔handleFault(SOAPMessageContext上下文){
返回true;
}
@凌驾
公共集getHeaders(){
返回null;
}
@凌驾
公共无效关闭(MessageContext上下文){
}
}
当我对
SOAPHandler
进行编码以创建
SOAPFault
对象(使用
SOAPFactory
)并将其抛出
SOAPFaultException
时,会出现完全相同的错误

基于堆栈跟踪,我查看了的源代码,看起来Axis2正在寻找causedByException,但在本例中,当然没有


有人知道为什么会发生这种情况,或者如何解决吗?谢谢

实际问题不是异常导致的缺失,而是websphere中的统一故障处理:


使用所述的解决方法或至少安装8.0.0.4,从版本8开始的WebSphere具有默认启用的安全功能,只返回消息“Internal Error”。这是对“”执行的。搜索“webservices.unified.faults”


要禁用此功能,请将-Dwebservices.unify.faults=false添加到JVM自定义属性中。

我也遇到了同样的问题,并且能够通过禁用统一故障处理来解决它(这不是一个bug,这是一个功能!)

在WAS开发人员控制台上

https://<yourhost>/<yourport>/ibm/console/login.do
https:////ibm/console/login.do
按照说明执行(针对WAS8):

单击服务器>服务器类型,以及WebSphere应用程序服务器>服务器名称或WebSphere代理服务器>服务器名称。接下来,在服务器基础设施部分,单击Java和流程管理>流程定义,然后选择控制、服务或附件。然后单击Java虚拟机>自定义属性

在那里,添加一个新属性
webservices.unify.faults
,并将该值设置为
false


可以通过禁用IBM Websphere应用程序服务器上的通用故障处理功能来解决此错误

要禁用此属性,请导航到管理控制台>服务器>应用程序服务器>进程定义>Java虚拟机>自定义属性

输入键为“webservice.unified.faults”,值为“false”


更新后,重新启动服务器并安装EAR以获取SOAP事务的自定义WSDL错误。

将WAS FP8.5.5.10升级到8.5.5.12后,我也遇到了同样的问题。我们有两个方法名完全相同但targetNameSpace不同的服务,比如DomainService1有'get'方法,DomainService2也有'get'方法,但WAS8.5.5.12抛出此异常,并且没有给出任何找到根本原因的线索。显然,在最新版本中,WAS对方法的命名更为严格

这是个例外: org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException:发生内部断言错误。com.xxx.web.myapp.services.jaxws.GetResponse JAXB对象没有XXXXX状态xml

更改特定于每个服务“getABC”和“getPQR”的方法的名称后,它就工作了


希望这能奏效

我当时是8.5.5,但仍然必须应用变量we services.unify.faults来回避这个问题
package simplified.demo;

import java.io.ByteArrayInputStream;
import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class FaultyHandler implements SOAPHandler<SOAPMessageContext> {

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        if (!outbound) {
            String responseXml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header></soapenv:Header><soapenv:Body><soapenv:Fault><faultcode>soapenv:Server</faultcode><faultstring>ORA-01031: insufficient privileges</faultstring><detail/></soapenv:Fault></soapenv:Body></soapenv:Envelope>";
            try {
                SOAPMessage newMsg = createSOAPMessage(responseXml);
                context.setMessage(newMsg);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        return (outbound);
    }

    private SOAPMessage createSOAPMessage(String responseXml) {
        try {
            ByteArrayInputStream in = new ByteArrayInputStream(responseXml.getBytes());
            MessageFactory messageFactory = MessageFactory.newInstance();
            return messageFactory.createMessage(null, in);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return true;
    }

    @Override
    public Set<QName> getHeaders() {
        return null;
    }

    @Override
    public void close(MessageContext context) {
    }
}
https://<yourhost>/<yourport>/ibm/console/login.do