You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:22:36