我想记录原始soap post请求,如果有任何错误,我正在使用JAX-WS。任何帮助将不胜感激。
是否有一种简单的方法(也就是说:不使用代理)只有在发生异常时才能访问使用JAX-WS参考实现(JDK 1.5及更好版本中包含的那个)发布的Web服务的原始请求/响应XML作为回应?我想记录原始的SOAP reuest,以便我可以在以后的任何webservice客户端测试它
答案 0 :(得分:32)
使用
com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true
和
com.sun.xml.internal.ws.transport.http.HttpAdapter.dump=true
干杯, 托
答案 1 :(得分:27)
我想我会提到这个:
internal
的属性名称以及何时不使用?如果您阅读Metro Guide,它会告诉您使用:
在客户端:
com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
在服务器上:
com.sun.xml.ws.transport.http.HttpAdapter.dump=true
然而:在我看来,当JAX-WS RI库作为标准包含在JDK中时(这是Java 6),Sun必须重命名属性名称以包含'internal'。因此,如果您使用JAX-WS RI,因为它与JDK捆绑在一起,那么您必须确保将internal
添加到属性名称。否则它将无法工作。换句话说,你需要使用:
在客户端:
com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true
在服务器上:
com.sun.xml.internal.ws.transport.http.HttpAdapter.dump=true
另一方面,如果您使用的是独立版本的JAX-WS RI(或整个Metro),我猜你应该使用属性名称而不用 {{1} }。
如果有人对此有内在的了解并且可以说这是否属实,我会很高兴。
答案 2 :(得分:4)
除了托斯滕的回答
com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump =真
确保在实例化WebServiceClient对象(扩展服务的对象)之前设置此项
答案 3 :(得分:3)
您可能想要尝试的第一件事是使用以下系统属性中的一个或两个:
客户端:
com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
服务器:
com.sun.xml.ws.transport.http.HttpAdapter.dump=true
答案 4 :(得分:2)
如果您使用Jboss 6.1并且想要将JAX-WS生成的类请求的日志打印到SOAP Web服务,
打开文件/home/oracle/jboss-eap-6.1/bin/standalone.sh
注意:请到你安装jboss的地方
你会发现类似的东西
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=n"
将其更改为如下所示
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true -agentlib:jdwp=transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=n"
还要确保启用调试
DEBUG_MODE=true
答案 5 :(得分:1)
我认为你需要的是一个处理程序,请参阅:
http://jax-ws.java.net/articles/handlers_introduction.html
使用处理程序,您可以拦截Web服务调用,并可以访问所有SOAP消息。
答案 6 :(得分:1)
这对我有用:
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
答案 7 :(得分:0)
可以使用系统属性(这里是test
任务的Gradle DSL):
systemProperty "com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true"
systemProperty "com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true"
systemProperty "com.sun.xml.ws.transport.http.HttpAdapter.dump", "true"
systemProperty "com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true"
systemProperty "com.sun.xml.ws.transport.http.HttpAdapter.dumpTreshold", "99999"
systemProperty "com.sun.xml.internal.ws.transport.http.HttpAdapter.dumpTreshold", "99999"
但是这些设置是全局的,并且可能需要大量设置才能在PROD上启用它们。...如果要减少XML日志记录的数量,则将过滤器添加到与业务逻辑绑定的日志记录框架并不是一件好事。
有关在WS处理程序中捕获req / rsp主体的详细信息,请参见我的答案How can I pass data back from a SOAP handler to a webservice client?
这是重要的部分:
public class MsgLogger implements SOAPHandler<SOAPMessageContext> {
public static String REQEST_BODY = "com.evil.request";
public static String RESPONSE_BODY = "com.evil.response";
@Override
public Set<QName> getHeaders() {
return null;
}
@Override
public boolean handleMessage(SOAPMessageContext context) {
SOAPMessage msg = context.getMessage();
Boolean beforeRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream(32_000);
context.getMessage().writeTo(baos);
String key = beforeRequest ? REQEST_BODY : RESPONSE_BODY;
context.put(key, baos.toString("UTF-8"));
context.setScope(key, MessageContext.Scope.APPLICATION);
} catch (SOAPException | IOException e) { }
return true;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return handleMessage(context);
}
@Override
public void close(MessageContext context) { }
}
要注册处理程序并使用保留的属性:
BindingProvider provider = (BindingProvider) port;
List<Handler> handlerChain = bindingProvider.getBinding().getHandlerChain();
handlerChain.add(new MsgLogger());
bindingProvider.getBinding().setHandlerChain(handlerChain);
Req req = ...;
Rsp rsp = port.serviceCall(req); // call WS Port
// Access saved message bodies:
Map<String, Object> responseContext = provider.getResponseContext();
String reqBody = (String) responseContext.get(MsgLogger.REQEST_BODY);
String rspBody = (String) responseContext.get(MsgLogger.RESPONSE_BODY);
使用此解决方案(仅是框架,适当的错误处理/边缘情况取决于您),您决定在得到响应后稍后再登录。