Apache Camel 无法修改 json 响应

问题描述

我对返回更新的 JSON 感到困扰,事实上,我从 cxfrs 端点收到了一个定义为机会的 JSON(这是一个业务术语,我们不需要解释它),将其转换为 String,然后检查在 jax-rs 控制器中调用方法,如果我们想要更新 Affair json,我们将消息作为字符串发布到队列 q.gestioncougar.cl.creation 中,如下所述:

<route id="servicetoCustomerlinksInboundRouting">
    <from uri="cxfrs:bean:oab_servicetoObsIT?loggingFeatureEnabled={{gestioncougar.wscall.log.enable}}&amp;loggingSizeLimit={{gestioncougar.wscall.log.size}}" />
        <to uri="bean:log?method=info(*,'Body : ${body}')"/>
        <convertBodyTo type="java.lang.String" />            
        <choice>
            <when>
                <simple>${header.operationName} == 'updateAffair'</simple>
                    <to uri="activemq:queue:q.gestioncougar.cl.creation?disableReplyTo=true" />
            </when>
        </choice>
</route>

绑定到 jax-rs 控制器的 cxfrs 服务的配置:

<cxf:RSServer address="{{gestioncougar.service.in.obsit.url}}" id="oab_servicetoObsIT"
    serviceClass="fr.oab.sie.esb.gestioncougar.customerlink.controller.CougarToCL" />

JAX-RS 控制器:

@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface CougarToCL {

    @PUT
    @Path("/updateAffair")
    void updateAffair(String request);

}

然后我们创建一个从队列中读取的路由q.gestioncougar.cl.creation,接下来将body解组为POJO格式(Java模型),并且通过方法读取它在 bean traiterCallFromCougar 中定义的 convertToCLFormat

<route id="servicetoCustomerlinksCreationOutboundRoute">
    <from uri="activemq:queue:q.gestioncougar.cl.creation" />
        <!-- Sauvegarde du body initial -->
        <unmarshal ref="formatJsonopportunity" />
        <!-- Sauvegarde du body -->
        <setProperty propertyName="savedBody">
            <simple>${body}</simple>
        </setProperty>
        <bean ref="traiterCallFromCougar" method="convertToCLFormat"/>
        <to uri="bean:log?method=info(*,'Customerlinks Body Format: ${body}')"/>
</route>

方法convertToCLFormat

public void convertToCLFormat(Exchange exchange){
    Opportunity opportunity = exchange.getProperty("savedBody",Opportunity.class);
    EsbLogger.info(exchange,"opportunity {}",opportunity.toString());
    exchange.getIn().setHeader(Exchange.CONTENT_TYPE,MediaType.APPLICATION_JSON);
    exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE,200);
    Affair affair = opportunityAffairMapper.toDealCL(opportunity.getDealCL());
    String clBody = affairjsonParser.parsePojoToJson(affair);
    EsbLogger.info(exchange,"affair {}",clBody);
    exchange.getout().setHeaders(exchange.getIn().getHeaders());
    exchange.getout().setBody(clBody);
}

问题来了!,即使我使用定义为 Affair 的新映射 JSON 设置正文,我也没有看到邮递员响应有任何变化,但是当我检查日志时正文发生了变化。

看看邮递员的请求:

enter image description here

非常感谢您的时间和帮助。

解决方法

不要将转换后的 JSON 放入“out”消息中,而应放入“in”消息中。

这太令人困惑了,以至于他们现在建议简单地使用 exchange.getMessage()(不区分 inout

在此处查看更多信息: https://camel.apache.org/manual/latest/camel-3-migration-guide.html#_getout_on_exchange

所以这应该有效:

exchange.getMessage().setBody(clBody);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...