首页 > 解决方案 > 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读取的路由,接下来将主体解组为 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 设置正文,我也看不到邮递员响应有任何变化,但是当我检查日志时正文发生了变化。

看一下邮递员的请求:

在此处输入图像描述

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

标签: javaspringrestapache-camelcxfrs

解决方案


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

这太令人困惑了,以至于他们现在建议简单地使用(无论是in还是outexchange.getMessage()都没有任何区别)

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

所以这应该工作:

exchange.getMessage().setBody(clBody);

推荐阅读