如何在Apache Camel中合并JSON校验结果与原JSON负载返回?
解决方案
你可以通过以下方式实现需求:在路由开始时保存原始JSON到Exchange属性,然后分别在校验成功和异常分支中组装目标JSON对象。
完整路由代码
import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.camel.Exchange; import org.apache.camel.component.jsonvalidator.JsonValidationException; import java.util.HashMap; import java.util.Map; // ... from("direct:myValidator") .log("Validating json...") // 提前保存原始JSON到Exchange属性,避免后续操作修改原数据 .setProperty("originalJson", body(String.class)) .to("json-validator:myschema.json") // 校验成功时,返回包含原JSON和成功信息的结果 .transform().exchange(exchange -> { String originalJson = exchange.getProperty("originalJson", String.class); Map<String, Object> resultMap = new HashMap<>(); resultMap.put("validatedJson", originalJson); resultMap.put("validationResult", "Validation passed successfully"); return new ObjectMapper().writeValueAsString(resultMap); }) // 捕获JSON校验异常 .onException(JsonValidationException.class) .continued(true) // 继续路由流程,不中断 // 校验失败时,组合原JSON和错误信息 .transform().exchange(exchange -> { String originalJson = exchange.getProperty("originalJson", String.class); JsonValidationException validationException = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, JsonValidationException.class); Map<String, Object> errorResultMap = new HashMap<>(); errorResultMap.put("validatedJson", originalJson); errorResultMap.put("validationResult", "Validation failed: " + validationException.getMessage()); return new ObjectMapper().writeValueAsString(errorResultMap); });
关键说明
- 保存原始JSON:通过
setProperty将原始请求体存入Exchange属性,确保在校验失败时能准确获取到未修改的原数据。 - 校验成功分支:从Exchange属性中取出原JSON,用
HashMap组装成包含validatedJson和validationResult的结构,再通过ObjectMapper转换为JSON字符串。 - 异常处理分支:通过
Exchange.EXCEPTION_CAUGHT获取捕获到的校验异常,提取错误信息后,同样组装成目标JSON格式返回。 - 依赖要求:确保项目中引入了Jackson依赖(
com.fasterxml.jackson.core:jackson-databind),用于JSON对象的序列化。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

