如何在Apache Camel中创建自定义转换器?JSON转JSON场景遇阻
Apache Camel 自定义JSON转JSON转换器实现
核心实现逻辑
继承Transformer后,重写transform方法只需完成输入获取、自定义转换、结果输出三个核心动作,以下是具体落地方案:
1. 依赖准备
确保项目引入Camel核心及Jackson依赖(用于JSON解析与生成):
<!-- Maven依赖示例 --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> <version>${camel.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency>
2. 自定义转换器代码
继承org.apache.camel.Transformer,在transform方法中编写具体的JSON转换逻辑:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.camel.Exchange; import org.apache.camel.Transformer; import java.lang.reflect.Type; public class CustomJsonTransformer extends Transformer { // 复用Jackson ObjectMapper,避免重复创建 private final ObjectMapper objectMapper = new ObjectMapper(); @Override public void transform(Exchange exchange, Type fromType, Type toType) throws Exception { // 1. 从Exchange读取输入JSON字符串 String inputJson = exchange.getIn().getBody(String.class); // 2. 解析JSON为Jackson JsonNode,方便操作结构 JsonNode inputNode = objectMapper.readTree(inputJson); // 3. 执行自定义转换逻辑(示例:字段重命名、新增/删除字段) ObjectNode outputNode = objectMapper.createObjectNode(); // 重命名字段:将"userId"改为"user_id" if (inputNode.has("userId")) { outputNode.put("user_id", inputNode.get("userId").asInt()); } // 新增固定字段 outputNode.put("converted_at", System.currentTimeMillis()); // 保留原有的"username"字段 if (inputNode.has("username")) { outputNode.set("username", inputNode.get("username")); } // 4. 将转换后的JSON写回Exchange String outputJson = objectMapper.writeValueAsString(outputNode); exchange.getIn().setBody(outputJson, String.class); // 设置响应Content-Type为JSON exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "application/json"); } }
3. 在Camel路由中使用转换器
Java DSL方式:
import org.apache.camel.builder.RouteBuilder; public class JsonTransformRoute extends RouteBuilder { @Override public void configure() throws Exception { from("direct:startJsonTransform") // 应用自定义转换器 .transform().using(new CustomJsonTransformer()) // 输出结果到日志 .to("log:com.yourpackage?level=INFO&showBody=true"); } }
Spring XML方式:
<!-- 注册自定义转换器Bean --> <bean id="customJsonTransformer" class="com.yourpackage.CustomJsonTransformer"/> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:startJsonTransform"/> <!-- 引用自定义转换器 --> <transform> <custom ref="customJsonTransformer"/> </transform> <to uri="log:com.yourpackage?level=INFO&showBody=true"/> </route> </camelContext>
注意事项
- 复杂场景优化:如果需要复杂结构映射,可以将输入JSON转为Java POJO,修改POJO后再序列化为输出JSON
- 异常处理:可在
transform方法中捕获JsonProcessingException,通过exchange.setException(e)设置异常信息 - 性能优化:务必复用
ObjectMapper实例,避免每次转换重复创建 - 版本兼容:以上代码适配Camel 3.x及以上版本,注意导包路径正确
内容的提问来源于stack exchange,提问作者Sujit Kumar
相关产品推荐
相关产品推荐

