Apache Camel Spring Boot中ProtoBuf转JSON:MessageOrBuilder创建求助
解决方案
首先明确:JsonFormat.printer().print()方法接收的是ProtoBuf生成的Message/MessageOrBuilder实例,而非原始字符串——你的代码直接传String类型的body必然报错,因为类型不匹配。另外,ProtoBuf文件是二进制格式,直接转成String会导致数据损坏,所以第一步要正确读取二进制内容并解析为对应的ProtoMessage对象。
修正步骤:
- 确保你已通过protoc工具生成对应ProtoBuf定义的Java类(比如假设你的Proto文件定义的消息类是
com.example.YourProtoMessage)。 - 在Processor中,将Exchange的body读取为
byte[]类型(而非String),因为ProtoBuf文件是二进制格式。 - 使用生成的ProtoMessage类的
parseFrom()方法解析字节数组,得到Message实例。 - 再用
JsonFormat.printer()将Message实例转换为JSON字符串。
修正后的Processor代码:
import com.google.protobuf.JsonFormat; import com.example.YourProtoMessage; // 替换成你实际的ProtoBuf生成类 import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ProtoBufToJsonProcessor implements Processor { private static final Logger logger = LoggerFactory.getLogger(ProtoBufToJsonProcessor.class); @Override public void process(Exchange exchange) throws Exception { logger.info("Entered ProtoBufToJson processor"); // 读取二进制格式的ProtoBuf内容 byte[] protoBytes = exchange.getIn().getBody(byte[].class); logger.info("Obtained proto binary data, length: {}", protoBytes.length); // 解析为对应的ProtoBuf Message实例 YourProtoMessage protoMessage = YourProtoMessage.parseFrom(protoBytes); // 转换为JSON字符串 String json = JsonFormat.printer().print(protoMessage); logger.info("Converted to JSON: {}", json); // 设置转换后的JSON为Exchange的body exchange.getIn().setBody(json); } }
额外注意事项:
- 如果你的ProtoBuf消息可能包含未知字段(比如新旧版本兼容场景),可以在解析时忽略未知字段:
YourProtoMessage protoMessage = YourProtoMessage.parseFrom(protoBytes, com.google.protobuf.parser().ignoringUnknownFields()); - 如果需要格式化输出的JSON(比如缩进),可以使用:
String json = JsonFormat.printer().omittingInsignificantWhitespace().print(protoMessage); - 确保项目中已引入正确依赖:除Apache Camel和Spring Boot相关依赖外,还需要
com.google.protobuf:protobuf-java和com.google.protobuf:protobuf-java-util(用于JsonFormat)。
内容的提问来源于stack exchange,提问作者Kiru
相关产品推荐
相关产品推荐

