Как отправить дополнительные поля в обработчик мыла вместе с soapMessage? - PullRequest
1 голос
/ 23 февраля 2012

Я регистрирую RequestXML для клиента веб-сервиса, используя SoapHandler, следующим образом

public boolean handleMessage(SOAPMessageContext smc) {
    logToSystemOut(smc);
    return true;
}


private void logToSystemOut(SOAPMessageContext smc) {
     Boolean outboundProperty = (Boolean)
     smc.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY);

    if (outboundProperty.booleanValue()) {
        out.println("\nOutbound message:");
    } else {
        out.println("\nInbound message:");
    }

    SOAPMessage message = smc.getMessage();
    try {
        message.writeTo(out);
        out.println("");   
        } catch (Exception e) {
        out.println("Exception in handler: " + e);
    }
} 

Получил новое требование для добавления этого xml в БД вместе с некоторыми дополнительными значениями (которых нет в xml). Можно ли как-нибудь передать несколько дополнительных полей описанному выше обработчику мыла (в методе handleMessage)?

Обратите внимание, что изменение xml / WSDL или добавление этого в заголовок сообщения SOAP для меня не вариант, поскольку он принадлежит другому интерфейсу. Любое другое решение?

Спасибо!

1 Ответ

0 голосов
/ 01 сентября 2012

Вы можете привести свой класс обслуживания к классу типа "BindingProvider". В этой форме вы можете использовать ее, чтобы назначить ей объекты, к которым вы сможете получить доступ позже из вашего SOAPHandler. Другое полезное использование заключается в том, что вы также можете изменить URL-адрес конечной точки следующим образом.

Перед звонком в сервис вы делаете:

    MySoapServicePortType service = new MySoapService().getMySoapServicePort();
    BindingProvider bp = (BindingProvider)service;
    MyTransferObject t = new MyTransferObject();
    bp.getRequestContext().put("myTransferObject", t);
    TypeResponse response = service.doRequest();
    SOAPMessage message = t.getRequestMessage(message);

Из функции регистрации вы делаете:

private void logToSystemOut(SOAPMessageContext smc) {
    ...
    MyTransferObject t = (MyTransferObject) messageContext.get("myTransferObject");
    if (outboundProperty.booleanValue())
        t.setRequestMessage(message);
    else
        t.setResponseMessage(message);
    ...
}
...