Rest 使用驼峰休息的SFTP

Rest 使用驼峰休息的SFTP,rest,apache-camel,Rest,Apache Camel,我对骆驼很陌生。我想从sftp位置提取一些xml文件,并将内容提供给现有的REST端点。下面是我的配置 <route id="xml.FOEBRE"> <from uri="<sftp server uri>"/> <marshal> <string/> </marshal> <setHeader headerName="Content-Type">

我对骆驼很陌生。我想从sftp位置提取一些xml文件,并将内容提供给现有的REST端点。下面是我的配置

<route id="xml.FOEBRE">
    <from uri="<sftp server uri>"/>
    <marshal>
        <string/>
    </marshal>
    <setHeader headerName="Content-Type">
        <constant>application/xml</constant>
    </setHeader>
    <doTry>
        <to uri="<REST URI>?httpMethod=POST"/>
        <bean ref="myListener" method="onPushSuccess"/>
        <doCatch>
            <exception>java.lang.Exception</exception>
            <!--<log message="error : ${exception.message}" loggingLevel="ERROR"/>-->
            <process ref="globalExceptionListener"/>
        </doCatch>
    </doTry>    
</route>
此代码将返回正确的响应主体。但当状态代码为400时,相同的代码(在catch listener中)不起作用。我有两个问题

  • 当状态代码为400时,如何捕获此响应正文?catch块中的处理器从未被调用
  • 为什么我要在exchange.getIn()中获取此主体,而不是在exchange.getOut()中

注意:我的REST服务返回两种状态,201表示成功,400表示失败。我知道我的服务在成功和失败场景中都会返回JSON负载。

您将从
getIn()
方法中的头中获取响应代码。如果遇到预期响应之外的任何问题(我的意思是HTTP调用错误),将抛出异常并将其设置到exchange属性中(exchange.exception\u已捕获)。

最终我得到了答案

  • 我的处理器正在被调用,但在执行处理器主体时遇到了NPE,该异常由camel在内部使用
  • 在异常期间,所有与异常相关的信息都可以从异常对象本身而不是从In/Out中检索
下面是我的异常处理程序(处理器)代码


感谢您的回复,但是如何获得回复正文。exchange.getIn().getBody(String.class)返回请求正文。我建议检查您的方法是否确实更改了请求正文您正在调用的端点是否确实更改了内容?可能没有。例如,试着通过邮递员检查它的行为。是的,我的回复主体在REST状态代码为201或400时有所不同。现在我可以通过exchange.getIn().getBody(String.class)捕获正文,以防成功[请参考更新的问题]。但在出现错误的情况下,情况并非如此。这也是为什么我在消息中得到响应,而不是在消息中得到响应。
Message message = exchange.getIn();
int status = message.getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class);
LOG.debug("Response status : {}", status);

LOG.debug("Payload successfully sent to securecargo");
String body = message.getBody(String.class);
LOG.debug("Response Body : {}", body); 
HttpOperationFailedException cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, HttpOperationFailedException.class);
LOG.error(cause.getMessage());
final String responseBody = cause.getResponseBody();
LOG.error(responseBody);