需要查看客户端的SOAP消息交谈外部Web服务 - 如何? (Eclipse的/ Netbeans的/ IDEA OK)

StackOverflow https://stackoverflow.com/questions/2221488

我有一个情况下,我必须用Java编写客户端对一个非常挑剔的外部Web服务(通过HTTPS),我可以跟在Eclipse的Java EE通过Web服务管理器中的Web服务。

不幸的是,我不能让客户问正确,所以我真的很想看到SOAP消息来回。作为新的Web服务,这是一个有点丛林。我很熟悉Eclipse,并且已经花了一些时间使用Netbeans和IntelliJ。

我真的,真的喜欢使用地铁堆栈,因为它允许这对一只股票的Java 6上运行,并部署规模的问题。有一个简单的方法,使地铁登录它做什么,或做它通过在Eclipse和Netbeans的TCP / IP监控说话吗?地铁文件似乎是主要针对Web服务的作者,而不是客户端,所以我可能很容易错过了。

有关的设置说任何建议,“这里是WSDL - 生成我的客户,我可以看交通”?

有帮助吗?

解决方案 3

这是有帮助的打开与

登录
-Dcom.sun.xml.ws.assembler.client=true

在Eclipse启动配置。

其他提示

只要把代理或“中间”一个TCP监听,你会看到的消息。

我已经使用 TCPMON 以类似的任务。

下面是另一种方式来观察SOAP消息:

假设生成的客户端类如下:

// generated service class
public class MyWebServiceClient extends javax.xml.ws.Service {
    // ...
    private final QName portName = "...";
    // ...
    public RetrieveMyObjects getRetrieveMyObjects() {
        return super.getPort(portName, RetrieveMyObject.class);
    }
    // ...
}

// generated port interface
// annotations here
public interface RetrieveMyObjects {

    // annotations here
    List<MyObject> getAll();

}

现在,在执行以下代码:

MyWebServiceClient wsClient = new MyWebServiceClient("wsdl/location/url/here.wsdl");
RetrieveMyObjectsPort retrieveMyObjectsPort = wsClient.getRetrieveMyObjects();

wsClient应该返回实例这是RetrieveMyObjectsjavax.xml.ws.BindingProvider接口两者实例。它不是JAX-WS的表面上的任何地方说,但似乎很多代码是基于这个事实。一个可以重新保证他\她自己通过执行类似的操作:。

if(!(retrieveMyObjectsPort instanceof javax.xml.ws.BindingProvider)) {
    throw new RuntimeException("retrieveMyObjectsPort is not instance of " + BindingProvider.class + ". Redirect following as well as authentication is not possible");
}

现在,当我们确信retrieveMyObjectsPortjavax.xml.ws.BindingProvider我们可以通过每个期望的web服务端口接口上调用下面的方法使SOAPMessage日志记录的实例:

/**
 * Enables logging of send and received SOAP messages on the specified {@link BindingProvider}s
 */
private static void enableSoapMessageLogging(final Logger logger, final BindingProvider... bindingProviders) {
    for(final BindingProvider bindingProvider : bindingProviders) {
        final List<Handler> handlerChain = bindingProvider.getBinding().getHandlerChain();
        handlerChain.add(new SOAPHandler<SOAPMessageContext>() {
            @Override
            public boolean handleMessage(final SOAPMessageContext context) {
                try {
                    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    context.getMessage().writeTo(baos);
                    logger.trace(new String(baos.toByteArray()));
                } catch(final Exception e) {
                    logger.error("", e);
                }
                return true;
            }

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

            @Override
            public void close(final MessageContext context) {
            }

            @Override
            public Set<QName> getHeaders() {
                return null;
            }
        });
        bindingProvider.getBinding().setHandlerChain(handlerChain);
    }
}

// and somewhere at the beginning of application ...
enableSoapMessageLogging(logger, (BindingProvider) retrieveMyObjectsPort);

希望这有助于

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top