问题描述
我对返回更新的 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}}&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 设置正文,我也没有看到邮递员响应有任何变化,但是当我检查日志时正文发生了变化。
看看邮递员的请求:
非常感谢您的时间和帮助。
解决方法
不要将转换后的 JSON 放入“out”消息中,而应放入“in”消息中。
这太令人困惑了,以至于他们现在建议简单地使用 exchange.getMessage()
(不区分 in 或 out)
在此处查看更多信息: https://camel.apache.org/manual/latest/camel-3-migration-guide.html#_getout_on_exchange
所以这应该有效:
exchange.getMessage().setBody(clBody);