Нужно видеть сообщения SOAP для клиента, взаимодействующего с внешней веб-службой - как это сделать?(Eclipse / Netbeans / ИДЕЯ в порядке)

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

Вопрос

У меня ситуация, когда я должен написать клиент на Java для очень требовательной внешней веб-службы (через https), и я могу связаться с веб-службой через обозреватель веб-служб в Eclipse Java EE.

К сожалению, я не могу заставить клиента правильно задать запрос, поэтому мне бы очень хотелось, чтобы сообщения SOAP возвращались туда и обратно.Будучи новичком в веб-сервисах, это немного запутанно.Я очень хорошо знаком с Eclipse и провел некоторое время с Netbeans и IntelliJ.

Я бы действительно предпочел использовать Metro stack, поскольку он позволяет запускать это на стандартной Java 6, а размер развертывания имеет значение.Есть ли простой способ заставить Metro регистрировать то, что он делает, или заставить его взаимодействовать через мониторы TCP / IP в Eclipse и Netbeans?Документация Metro, похоже, в первую очередь ориентирована на автора веб-сервиса, а не на клиента, так что я вполне мог ее пропустить.

Есть какие-нибудь предложения по настройке с надписью "Вот WSDL - сгенерируй мне клиент, где я могу видеть трафик"?

Это было полезно?

Решение 3

Было полезно включить ведение журнала с помощью

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

в конфигурации запуска Eclipse.

Другие советы

Просто поместите прокси-сервер или tcp-монитор "посередине", и вы увидите сообщение.

Я использовал тспмон для аналогичной задачи.

Вот еще один способ просмотра сообщений 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");
}

Теперь, когда мы уверены, что 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