2016-05-10 11 views
1

У меня есть конечная точка spring ws как часть проекта Spring Integration, и я хотел бы получить доступ к заголовку Soap. Когда я добавляю SoapHeader к параметрам методы я получаю следующее исключение:Добавить SoapHeader в Spring WS Endpoint

[10/05/16 05: 00: 05: 005] PDT-локальные стартстопного-1 DEBUG springframework.integration.util.MessagingMethodInvokerHelper .doWith(): Метод [public com.bstonetech.ptms.integration.model.ws.external.contract.GetContractResponse com.bstonetech.ptms.integration.service.ws.GetContractEndpoint.getContract (com.bstonetech.ptms. integration.model.ws.external.contract.GetContractRequest, org.springframework.ws.context.MessageContext) throws java.lang.Exception] не подходит для обработки сообщений Найдено несколько типов кандидатов: [@ org.springframework.ws.server.endpoint.annotation.RequestPayload com.bstonetech.ptms.integration.model.ws.external.contract.GetContractRequest] и [org.springframework.ws.context.MessageContext]. [10/05/16 05: 00: 05: 005 PDT] локальный-стартстопный-1 WARN web.context.support.XmlWebApplicationContext.refresh(): Исключение , возникшие в ходе инициализации контекста - отмена попытки обновления

ява .lang.IllegalArgumentException: целевой объект типа [класс com.bstonetech.ptms.integration.service.ws.GetContractEndpoint] не имеет подходящих методов обработки сообщений.

Такая же ошибка возникает при использовании MessageContext messageContext.

У меня явно нет чего-то. Любая помощь будет оценена по достоинству.

интеграции выглядит следующим образом:

<oxm:jaxb2-marshaller id="contractMarshaller" context-path="com.bstonetech.ptms.integration.model.ws.external.contract"/> 
    <ws:inbound-gateway id="getContractWs" request-channel="inboundGetContractChannel" mapped-request-headers="fileId" mapped-reply-headers="fileId" 
         marshaller="contractMarshaller" unmarshaller="contractMarshaller"/> 



    <int:service-activator id="contractEndpoint" input-channel="inboundGetContractChannel" ref="getContractEndpoint"/> 

Конечная точка выглядит следующим образом:

@Endpoint 
public class GetContractEndpoint { 

    private static final String NAMESPACE_URI = "http://bstonetech.com/contract"; 

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "GetContractRequest") 
    @ResponsePayload 
    public GetContractResponse getContract(@RequestPayload GetContractRequest request, SoapHeader soapHeader) throws Exception { 
..... 
} 

ответ

0

Извините за задержку. Мы были заняты Spring Integration 4.3.0.RC1 релиз :-).

Хорошо, похоже, что вы что-то пропустили и, следовательно, столкнулись с рядом проблем.

Весна WS метод POJO вызов аннотаций (@RequestPayload, @PayloadRoot) и SOAP-специфическая инъекция аргумента действительно для случая POJO, когда у вас есть @Endpoint на службе и опираться на механизме Spring WS @EnableWs или аналогичного.

С другой стороны, правый модуль Spring Integration WS полностью основан на проекте Spring WS, но он стремится как можно быстрее преобразовать все в Spring Integration Messaging. Поэтому результат <ws:inbound-gateway> равен Message, отправленному на номер request-channel="inboundGetContractChannel". В вашем случае payload будет уже немаршрутизирован для какого-либо объекта вашего домена в соответствии с отображением JaxB.

<service-activator> теперь может работать только с инфраструктурой обмена сообщениями, и он уже ничего не знает о SOAP. Это общая цель обмена сообщениями, когда вы можете переключиться на совершенно другой источник (например, DB), но по-прежнему использовать тот же <service-activator>.

Для выполнения какого-то метод POJO призывания есть полезные аннотации, как @Payload@Header т.д.

быть последовательными и еще некоторая информация SOAP, то AbstractWebServiceInboundGateway консультируется с DefaultSoapHeaderMapper и извлекать source.getSoapHeader() состояния как отдельный MessageHeaders. Таким образом, вы по-прежнему имеете доступ к желаемым заголовкам по запросу.

+0

Спасибо, я понимаю. Теперь я использую PayloadRootQNameEndpointMapping, чтобы выполнить сопоставление шлюза и просто реализовать конечную точку как POJO. – alan

+0

Вы все еще можете сделать это и получить прибыль от обмена сообщениями вниз по течению. Просто переместите всю конфигурацию «@Endpoint» на уровень @MessagingGateway –

+0

Следуя этому, я внедрил EnpointInterceptor для перехвата каждого входящего вызова веб-службы. Я пишу в базу данных в каждом конкретном случае и успешно выполняю команду. Я хотел бы иметь возможность передать созданный идентификатор строки базы данных в POJO. Я вижу, что MessageContext имеет свойства, которые я могу установить. Возможно ли получить MessageContext в POJO или сопоставить свойства заголовкам перед выполнением POJO? – alan