java - 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}}&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 设置正文,我也看不到邮递员响应有任何变化,但是当我检查日志时正文发生了变化。
看一下邮递员的请求:
非常感谢您的时间和帮助。
解决方案
不要将转换后的 JSON 放入“out”消息中,而是放入“in”消息中。
这太令人困惑了,以至于他们现在建议简单地使用(无论是in还是outexchange.getMessage()
都没有任何区别)
在此处查看更多信息: https ://camel.apache.org/manual/latest/camel-3-migration-guide.html#_getout_on_exchange
所以这应该工作:
exchange.getMessage().setBody(clBody);
推荐阅读
- postgresql - 无法在 WSL Ubuntu 上启动 postgresql
- python-3.x - 使用 pip3 install 命令的权限被拒绝问题
- ruby-on-rails - devise_token_auth 与非设计路线的设计
- python - Python - 返回一个元组的函数,其中包含 l 中所有正数的最小值、最大值、总和和平均值
- python - 将日期传递给列表
- c++ - 折叠表达式和函数名查找
- elasticsearch - 弹性搜索术语查询未获取所有文档
- python - 有没有办法做一个幅度限制的天文查询锥搜索?
- reactjs - 反应路线问题
- unity3d - 向 TextMeshPro 文本添加轮廓