我在处理 <int-ws:outbound-gateway>
上的 http 错误时遇到问题
我尝试放置 error-channel
上<int:gateway>
,但它似乎不起作用,因为我遇到了解码异常。
另外我觉得这是不对的,在从<int-ws:outboung-gateway>
收到消息后应该在某个地方捕获http错误。
我的消息系统是这样设置的:
<int:gateway> -> channel -> transformer -> channel -> <int-ws:outboung-gateway>
问题:使用 Spring 集成捕获 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
后在网关上,线程被卡在某个地方。这是一个相当虚拟的问题,service-activator
的名称。网关错误 channel 为 errorHandler
,它可能由 spring 命名空间使用 -> 更改 bean 名称解决了问题。
最佳答案
我们可以在 unmarshal 期间处理 spring 集成中的 http 错误。
编写自定义解码器并捕获肥皂故障消息。
这篇文章清楚地解释了如何处理soap错误消息。
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;
}
}
关于java - 使用 int-ws 上的 spring 集成处理 Http 错误 :outbound-gateway,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24009733/