У меня возникают проблемы с обработкой http erros на <int-ws:outbound-gateway>
Я попытался разместить error-channel
в <int:gateway>
, но он, похоже, не работает, потому что я получаю unmarshalling исключения.
Плюс я чувствую, что это не так, http ошибки должны быть пойманы где-то после того, как сообщение получено от <int-ws:outboung-gateway>
Моя система обмена сообщениями настроена следующим образом: <int:gateway> → channel → transformer → channel → <int-ws:outboung-gateway>
Вопрос: какой правильный способ уловить ошибки http с интеграцией с весной?
ПОСЛЕ ИЗМЕНЕНИЯ
<int:channel id="checkProcessRequestChannel"/>
<int:channel id="checkProcessResponseChannel"/>
<int:channel id="errorChannel"/>
<!-- channels for connecting to the outbound gateway -->
<int:channel id="checkProcessOutboundRequestChannel"/>
<int:channel id="checkProcessOutboundResponseChannel"/>
<int:gateway id="eInvoiceGateway" service-interface="com.iquest.play.integration.einvoice.EInvoiceGateway" error-channel="errorChannel">
<int:method name="checkProcessByCode" request-channel="checkProcessRequestChannel" reply-channel="checkProcessResponseChannel"/>
<int:gateway>
<int:transformer ref="eInvoiceTransformer" method="transformCheckProcessRequest" input-channel="checkProcessRequestChannel" output-channel="checkProcessOutboundRequestChannel"/>
<int:transformer ref="eInvoiceTransformer" method="transformCheckProcessResponse" input-channel="checkProcessOutboundResponseChannel" output-channel="checkProcessResponseChannel"/>
<int-ws:outbound-gateway id="checkClientByCodeOutboundGW"
request-channel="checkProcessOutboundRequestChannel"
reply-channel="checkProcessOutboundResponseChannel"
marshaller="eInvoiceMarshaller"
unmarshaller="eInvoiceMarshaller"
destination-provider="eInvoiceUriProvider"
message-factory="eInvoiceMessageFactory"
/>
ИСПРАВЛЕНИЕ: Итак, после размещения error-channel
на шлюзе, поток застрял где-то. Это была довольно фиктивная проблема, имя errorHandler
service-activator
для шлюза error-channel было errorHandler
, вероятно, оно использовалось весенним пространством имен → изменение имени компонента решило проблему.
Мы можем обрабатывать ошибки HTTP в интеграции весов во время немаршала.
Напишите пользовательский unmarshaller и поймайте сообщение о неисправности мыла.
В этой статье объясняется, как обращаться с сообщением о неисправности мыла.
http://blog.hostmasterzone.com/how-to-unmarshal-soap-fault-in-spring-integration-web-service/
<bean id="hmzJaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPaths">
<list>
<value>org.hmz.request.types</value>
</list>
</property>
</bean>
<bean id="custJaxbUnMarshaller" class="com.jay.hmz.util.CustJaxbUnMarshaller" >
<property name="contextPaths">
<list>
<value>org.hmz.request.types</value>
</list>
</property>
</bean>
<int:chain input-channel="channel.in" output-channel="channel.out">
<int:transformer method="transformParentRequestById"><bean class="org.jay.hmz.api.transformers.OrderTransformer"/></int:transformer>
<int-ws:header-enricher><int-ws:soap-action value="${order.request.uri}"/></int-ws:header-enricher> <int-ws:outbound-gateway interceptors="hmzSecurityInterceptor" mapped-request-headers="GUID, USER_REF" request-callback="hmzWebServiceMessageCallback" unmarshaller="custJaxbUnMarshaller" marshaller="hmzJaxbMarshaller" uri="${order.request.uri}"/>
<int:transformer method="transformRetrieveParentOrderResponse"><bean class="org.jay.hmz.api.transformers.OrderTransformer"/></int:transformer>
</int:chain>
<int:service-activator input-channel="requestErrorChannel" output-channel="response.out" ref="requestErrorHandler" method="handleFailedOrderRequest"/>
<bean id="requestErrorHandler" class="org.jay.hmz.api.errorhandler.RequestErrorHandler"/>
public class CustJaxbUnMarshaller extends Jaxb2Marshaller {
@Override
public Object unmarshal(Source source, MimeContainer mimeContainer)
throws XmlMappingException {
LOGGER.debug("Inside Custom JaxbWrapper unmarshal");
Object mimeMessage = new DirectFieldAccessor(mimeContainer)
.getPropertyValue("mimeMessage");
Object unmarshalObject = null;
if (mimeMessage instanceof SaajSoapMessage) {
SaajSoapMessage soapMessage = (SaajSoapMessage) mimeMessage;
String faultReason = soapMessage.getFaultReason();
if (faultReason != null) {
throw convertJaxbException(new JAXBException(faultReason));
} else {
unmarshalObject = super.unmarshal(source, mimeContainer);
}
}
return unmarshalObject;
}
}