- 浏览: 119468 次
- 性别:
- 来自: 上海
文章分类
最新评论
In one of my projects, I developed the Restful web service on Jersey and consume/produces Protobuf message. It all worked well until a new requirement came to add support of Javascript client. So, I added 4 more classes:
HextUtils
JsonFormat
JsonMessageReader
JsonMessageWriter
along with two existing classes
ProtobufMessageReader
ProtobufMessageWriter
now the web service can support both message formats. Just make sure to NOT have any media type explicitly defined in the web service classes – Jersey will pick up the correct reader/writer based on the incoming contest-type and accept headers.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import com.google.protobuf.ExtensionRegistry;
import com.google.protobuf.GeneratedMessage;
@Provider
@Consumes(“application/json”)
public class JsonMessageReader implements MessageBodyReader {
public static String LS = System.getProperty(“line.separator”);
private ExtensionRegistry extensionRegistry = ExtensionRegistry
.newInstance();
@Override
public boolean isReadable(Class arg0, Type arg1, Annotation[] arg2,
MediaType mediaType) {
return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
}
public T readFrom(Class type, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap httpHeaders,
InputStream entityStream) throws IOException, WebApplicationException {
try
{
Method newBuilder = type.getMethod(“newBuilder”);
GeneratedMessage.Builder builder = (GeneratedMessage.Builder) newBuilder.invoke(type);
String data = convertInputStreamToString(entityStream);
JsonFormat.merge(data, extensionRegistry, builder);
return (T) builder.build();
}
catch (Exception e)
{
throw new WebApplicationException(e);
}
}
private String convertInputStreamToString(InputStream io) {
StringBuffer sb = new StringBuffer();
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(io));
String line = reader.readLine();
while (line != null) {
sb.append(line).append(LS);
line = reader.readLine();
}
} catch (IOException e) {
throw new RuntimeException(“Unable to obtain an InputStream”, e);
}
return sb.toString();
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import com.google.protobuf.Message;
@Provider
@Produces(“application/json”)
public class JsonMessageWriter implements MessageBodyWriter {
@Override
public long getSize(T arg0, Class arg1, Type arg2, Annotation[] arg3,
MediaType arg4) {
return -1;
}
@Override
public boolean isWriteable(Class arg0, Type arg1, Annotation[] arg2,
MediaType mediaType) {
return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
}
@Override
public void writeTo(T arg0, Class arg1, Type arg2, Annotation[] arg3,
MediaType arg4, MultivaluedMap arg5,
OutputStream outputStream) throws IOException, WebApplicationException {
outputStream.write(JsonFormat.printToString((Message) arg0).getBytes());
}
}
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import com.google.protobuf.GeneratedMessage;
import com.google.protobuf.Message;
/**
* Message Body Reader.
*/
@Provider
@Consumes(“application/x-protobuf”)
public class ProtobufMessageReader implements MessageBodyReader
{
public boolean isReadable(Class type, Type genericType,
Annotation[] annotations, MediaType mediaType)
{
return Message.class.isAssignableFrom(type);
}
public Message readFrom(Class type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException
{
try
{
Method newBuilder = type.getMethod(“newBuilder”);
GeneratedMessage.Builder builder = (GeneratedMessage.Builder) newBuilder.invoke(type);
return builder.mergeFrom(entityStream).build();
}
catch (Exception e)
{
throw new WebApplicationException(e);
}
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import com.google.protobuf.Message;
/**
* A Message Body Writer
*/
@Provider
@Produces(“application/x-protobuf”)
public class ProtobufMessageWriter implements MessageBodyWriter {
public boolean isWriteable(Class type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return Message.class.isAssignableFrom(type);
}
public long getSize(Message m, Class type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return m.getSerializedSize();
}
public void writeTo(Message m, Class type, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException,
WebApplicationException {
entityStream.write(m.toByteArray());
}
}
All credits go to the people who have contributed and open-sourced the protobuf and json projects.
发表评论
-
(转)JDK工具(查看JVM参数、内存使用情况及分析等)
2018-12-25 15:50 306https://www.cnblogs.com/z ... -
[转]jstat查看jvm的GC情况
2018-12-25 15:38 505jstat 1. jstat -gc pid ... -
转一个 jmap 的基本使用方法
2017-04-05 11:52 488原文:http://hbluojiahui.bl ... -
(转)JVM内存堆布局图解分析
2017-04-05 11:56 356转载原文出处:http://www.codeceo.com/ ... -
(转)系统吞吐量(TPS)、用户并发量、性能测试概念和公式
2017-03-27 11:19 419PS:下面是性能测试的主要概念和计算公式,记录下: 一.系 ... -
(转)深入理解Major GC, Full GC, CMS
2016-11-02 11:27 454原文:http://blog.csdn.net/iter_ ... -
(转)OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程
2016-07-26 18:51 608OpenSSL 1.0.0生成p12、jks、crt等格式 ... -
(转)Java 内存区域和GC机制
2016-07-26 14:09 333录 Java垃圾回收概况 Java内存区域 Java ... -
Understanding CMS GC Logs
2016-07-26 11:06 493Understanding CMS GC Logs By ... -
(转)Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
2016-07-08 17:56 551源地址:http://blog.csdn.net/lu ... -
linux下查看最占性能的JAVA进程
2016-03-08 11:58 589记录一下自己常用的linux系统命令,方便以后查阅,发觉记忆 ... -
(转,精)Java 多线程 并发编程
2015-10-10 19:50 759源地址:http://blog.csdn.n ... -
java虚拟机内存监控工具jps,jinfo,Jstack,jstat,jmap,jhat使用
2015-09-21 13:14 1135源地址:http://my.oschina. ... -
(转)JMM模型
2014-11-11 16:53 452源地址:http://blog.csdn.net/gt ... -
(转)《深入浅出 Java Concurrency》目录
2014-11-10 15:55 356原文地址:http://www.blogjava.net/x ... -
(转)TCP/IP、Http、Socket的区别
2014-08-21 10:32 779源地址: http://jingyan.baidu.com/ ... -
(转)Swift里的CAP理论和NWR策略应用
2014-08-12 17:25 577源地址:http://blog.sina.com.cn/s/ ... -
(转)Java多线程编程的常见陷阱
2014-06-25 13:14 465源地址:http://developer.51cto.com ... -
(转)Java 正确的做字符串编码转换
2014-03-11 21:52 610原文:http://hi.baidu.com/sodarf ... -
深入理解java内存模型系列文章
2013-12-30 10:57 404深入理解java内存模型系列文章 源地址: htt ...
相关推荐
使用protobuf的Description技术,实现protobuf结构体与json语言之间的黑盒转换.
实现protobuf和json互相转换python3源码,protobuf是Google开源的新传输协议,压缩效率和传输效率比XML和json都要高
protobuf-jsonschema 将编译为定义。 用法 您可以将protobuf-jsonschema用作命令行工具,或用作node中的函数。 CLI可以输出JSON或YAML(例如,用于Swagger)。 如果您指定一个protobuf消息名称以及一个文件,它将...
从Protobuf到JSON-Schema编译器这将采用protobuf定义并将其转换为JSONSchemas,可用于动态验证JSON消息。 对于使用ProtoBuf定义数据但将JSON用作“ wire”格式的人们很有用。 受到“重大影响”。安装注意:此工具...
protobuf转换为json,原版中存在bug,使用时候修复了原版的bug
本资源提供了一个基于protobuf反射特性的pb结构与json相互转换的实例,该实例程序主要有两个核心函数myMessage2Json、myJson2Message。前者的作用是将pb结构转换成对应的json,后者是将json转换成对应的pb结构体。...
利用spring整合了Jersey和Protobuf,搭建了一个简单的Rest web service的工程,仅当作学习; 客户端是用python写的一个简单工程;
RESTful + Protobuf 该项目试图演示RESTful API对protobuf协议的用法。 该服务使用Go编写,并且使用Javascript和Ruby提供了两个客户端。 先决条件 码头工人 protoc(如果您想尝试编译protobuf文件) 试用代码 make ...
可支持protobuf 与 json 的互转. 但必须protobuf生成时不能带lite.
protobuf对象不能直接使用jsonlib去转,因为protobuf生成的对象的get方法返回的类型有byte[],而只有String类型可以作为json的key,protobuf提供方法进行转换
编译好直接可以使用的protobuf文件。运行bat文件,即可直接生成对应.proto的头文件和源文件
重新生成protobuf: protoc addressbook.proto --python_out .Protobuf 与 python3 不兼容所以使用 python2
protobuf 标准 and 精简 SO
用ProtoBuf.js将JSON数据缓存转成二进制缓存 edit by Seven on 2015-05-31 项目介绍 安装 npm install 转换 node main 测试 node server 各程序功能 main.js 用来将 hour.json 转成 www/hour.bin 。 server.js 用...
python-3.7.4、protobuf-3.5.1离线安装完整资源。
parse TS interface to pinus-protobuf JSON解析 ts 的interface 到 pinus-protobuf用的 json格式。pinus:changelogv0.2.3:fix sort method.v0.2.2: 生成的消息做排序v0.2.1:支持 结构放到顶层 (默认的客户端不支持,...
ChirpStack盖特威大桥是转换LORA:registered:数据包转发协议为ChirpStack网络服务器的服务(JSON和的Protobuf)。 该组件是ChirpStack开源LoRaWAN:registered:网络服务器堆栈的一部分。 后端 提供了以下数据包转发...
path: google/protobuf/timestamp.proto 在 timestamppb 中 Timestamp 包含两个字段 seconds 表示秒 nanos 表示纳秒 message Timestamp { int64 seconds = 1; int32 nanos = 2; } timestamp.go path: github....
NULL 博文链接:https://cxshun.iteye.com/blog/1974498