返回fault gets“的JAX-WS服务器端SOAPHandler;“内部错误”;在WebSphereV8上
我有一个服务器端JAX-WS返回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
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