【问题标题】:Handle Http errors with spring integration on int-ws:outbound-gateway使用 int-ws:outbound-gateway 上的 spring 集成处理 Http 错误
【发布时间】:2014-06-03 07:46:44
【问题描述】:

我在处理 <int-ws:outbound-gateway> 上的 http 错误时遇到问题
我尝试在<int:gateway> 上放置error-channel,但它似乎不起作用,因为我得到了解组异常。
另外我觉得不对,应该是在收到<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 的名称是 errorHandler,它可能被 spring 命名空间使用 -> 更改 bean 名称解决了问题。

【问题讨论】:

  • 您是否与 5xx 错误有关?
  • 是的,我需要忽略肥皂故障并只处理 http 5xx 错误
  • 你能显示来自 int:gateway 的流通过错误通道吗?
  • 我添加了一个after edit 部分
  • 你所做的是正确的——异常被网关捕获并发送到error-channel。 “......但它似乎不起作用,因为我得到解组异常......” - 你能进一步解释吗?打开 DEBUG 日志并遵循消息流 - 它应该变得清晰。

标签: java web-services http spring-integration


【解决方案1】:

我们可以在解组期间处理 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;
    }
}

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2018-07-05
    • 2015-10-03
    相关资源
    最近更新 更多