apache camel无法修改json响应

zlhcx6iw  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(332)

我很烦返回一个更新的json,事实上,我从cxfrs端点收到一个定义为opportunity的json(这是一个业务术语,我们不需要解释它),将它转换成字符串,然后检查jax rs controller中调用的方法,如果我们想更新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);
}

问题来了!,即使我用新Map的json将body定义为affence,我也看不到postman响应中有任何更改,但是当我检查日志时,body已经更改了。
看看 Postman 的要求:

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

khbbv19g

khbbv19g1#

不要将转换后的json放在“out”消息中,而是放在“in”消息中。
这是如此混乱,他们现在建议只使用 exchange.getMessage() (不分内外)
更多信息请参见:https://camel.apache.org/manual/latest/camel-3-migration-guide.html#_getout_on_exchange
所以这应该有效:

exchange.getMessage().setBody(clBody);

相关问题