2010-02-08 15 views
1

我有一种情况,我必须在Java中针对非常挑剔的外部Web服务(通过https)编写客户端,并且我可以通过Eclipse Java中的Web服务资源管理器与Web服务交谈EE。需要查看客户端与外部Web服务交谈的SOAP消息 - 如何? (Eclipse/Netbeans/IDEA ok)

不幸的是,我不能让客户端正确询问,所以我真的很想看到SOAP消息来回传递。作为网络服务的新手,这是一个丛林。我对Eclipse非常熟悉,并且花费了一些时间与Netbeans和IntelliJ。

我真的很喜欢使用Metro堆栈,因为它允许它在库存Java 6上运行,并且部署大小很重要。是否有一种简单的方法可以让Metro日志记录它的功能,或者通过Eclipse和Netbeans中的TCP/IP监视器进行通话? Metro文档似乎主要针对Web服务作者,而不是客户端,所以我可能很容易错过它。

有关安装程序的任何建议“这里是WSDL - 生成一个我可以看到流量的客户端”?

+0

这是有帮助的开启与 'System.setProperty记录( “com.sun.metro.soap.dump”, “真”);' – 2010-02-08 12:58:32

回答

1

这是大有裨益的

-Dcom.sun.xml.ws.assembler.client=true 
在Eclipse启动配置

启用日志记录。

2

只需将代理或tcp监视器“放在中间”即可看到该消息。

我一直在使用tcpmon进行类似的任务。

+0

谢谢。这也适用于https连接? – 2010-02-08 13:35:41

+0

哎呀,错过了“over https”部分。它不会在https上工作。但为了开发的目的,你不能切换到http?那么,既然你是沟通的一个方面,你可以解密https消息,但这可能太令人头疼。 – Bozho 2010-02-08 13:37:05

+0

不,我无法控制远程网络服务:( – 2010-02-09 10:57:17

2

这里是另一种方式来观察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应该返回实例,该实例是RetrieveMyObjects的实例& javax.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情况下,我们可以通过每个期望网络服务端口接口上调用以下方法使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); 

希望这有助于

相关问题