클라이언트를위한 비누 메시지를 볼 필요가있어 외부 웹 서비스와 대화하는 방법 - 방법은 무엇입니까? (Eclipse/netbeans/idea ok)

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

문제

매우 까다로운 외부 웹 서비스 (HTTPS)에 대해 Java로 클라이언트를 작성 해야하는 상황이 있으며 Eclipse Java EE의 웹 서비스 탐색기를 통해 웹 서비스와 대화 할 수 있습니다.

불행히도 나는 고객에게 제대로 물어 보도록 할 수 없으므로 비누 메시지가 앞뒤로 진행되는 것을 정말로보고 싶습니다. 웹 서비스를 처음 접하는 것은 약간의 정글입니다. 나는 Eclipse에 매우 익숙하며 Netbeans 및 Intellij와 시간을 보냈습니다.

나는 실제로 주식 Java 6에서 실행되고 배치 크기가 중요하기 때문에 Metro Stack을 사용하는 것을 정말로 선호합니다. 메트로 로그를 만들거나 이클립스와 NetBeans에서 TCP/IP 모니터를 통해 대화하게하는 간단한 방법이 있습니까? 메트로 문서는 주로 클라이언트가 아닌 웹 서비스 저자를 대상으로하는 것으로 보이므로 쉽게 놓쳤을 수도 있습니다.

"여기에 WSDL이 있습니다 - 트래픽을 볼 수있는 고객을 생성하십시오"라는 설정에 대한 제안이 있습니까?

도움이 되었습니까?

해결책 3

로깅을 켜는 것이 도움이되었습니다

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

Eclipse 런칭 구성에서.

다른 팁

프록시 또는 TCP 모니터를 "중간에"넣으면 메시지가 표시됩니다.

나는 사용하고있다 tcpmon 비슷한 작업을 위해.

다음은 비누 메시지를 관찰하는 또 다른 방법입니다.

생성 된 클라이언트 클래스가 다음과 같습니다.

// 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");
}

이제 우리가 확신 할 때 retrieveMyObjectsPort 인스턴스입니다 javax.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);

도움이 되었기를 바랍니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top