栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将Google原始缓冲区与Jersey / JAX-RS结合

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将Google原始缓冲区与Jersey / JAX-RS结合

的JAX-RS的用途实现

MessageBodyReader
MessageBodyWriter
序列化/反序列化和从differen媒体类型。您可以在JAX-
RS Entity Providers上
阅读更多内容。您可以编写自己的文件来处理protobuf对象的序列化/序列化。然后,只需通过发现来显式或隐式地在应用程序中注册提供程序。

widgets.proto

package widget;option java_package = "protobuf.example";option java_outer_classname = "WidgetsProtoc";message Widget {    required string id = 1;    required string name = 2;}message WidgetList {    repeated Widget widget = 1;}

编译后,将剩下一个

WidgetsProtoc
带有静态内部
Widget
WidgetList
类的类。

WidgetResource

import javax.ws.rs.Consumes;import javax.ws.rs.GET;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.Response;import protobuf.example.WidgetsProtoc.Widget;import protobuf.example.WidgetsProtoc.WidgetList;@Path("/widgets")public class WidgetResource {    @GET    @Produces("application/protobuf")    public Response getAllWidgets() {        Widget widget1 =      Widget.newBuilder().setId("1").setName("widget 1").build();        Widget widget2 =      Widget.newBuilder().setId("2").setName("widget 2").build();        WidgetList list = WidgetList.newBuilder()     .addWidget(widget1).addWidget(widget2).build();        return Response.ok(list).build();    }    @POST    @Consumes("application/protobuf")    public Response postAWidget(Widget widget) {        StringBuilder builder = new StringBuilder("Saving Widget n");        builder.append("ID: ").append(widget.getId()).append("n");        builder.append("Name: ").append(widget.getName()).append("n");        return Response.created(null).entity(builder.toString()).build();    }}

您会注意到

"application/protobuf"
媒体类型的使用。这不是标准的媒体类型,但是正在编写中。同样,番石榴库有定义这种媒体类型
MediaType.PROTOBUF
,转化为
"application/protobuf"
,所以我选择了坚持

MessageBodyReader
MessageBodyWriter
在一类中定义。您可以选择单独进行。没有区别。

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.lang.annotation.Annotation;import java.lang.reflect.Type;import javax.ws.rs.BadRequestException;import javax.ws.rs.Consumes;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.MessageBodyReader;import javax.ws.rs.ext.MessageBodyWriter;import javax.ws.rs.ext.Provider;import protobuf.example.WidgetsProtoc.Widget;import protobuf.example.WidgetsProtoc.WidgetList;@Provider@Produces("application/protobuf")@Consumes("application/protobuf")public class WidgetProtocMessageBodyProvider         implements MessageBodyReader, MessageBodyWriter {    @Override    public boolean isReadable(Class type, Type type1,  Annotation[] antns, MediaType mt) {        return Widget.class.isAssignableFrom(type)      || WidgetList.class.isAssignableFrom(type);    }    @Override    public Object readFrom(Class type, Type type1, Annotation[] antns,  MediaType mt, MultivaluedMap mm, InputStream in)  throws IOException, WebApplicationException {        if (Widget.class.isAssignableFrom(type)) { return Widget.parseFrom(in);        } else if (WidgetList.class.isAssignableFrom(type)) { return WidgetList.parseFrom(in);        } else { throw new BadRequestException("Can't Deserailize");        }    }    @Override    public boolean isWriteable(Class type, Type type1,  Annotation[] antns, MediaType mt) {        return Widget.class.isAssignableFrom(type)      || WidgetList.class.isAssignableFrom(type);    }    @Override    public long getSize(Object t, Class type, Type type1,  Annotation[] antns, MediaType mt) {  return -1; }    @Override    public void writeTo(Object t, Class type, Type type1,  Annotation[] antns, MediaType mt,  MultivaluedMap mm, OutputStream out)  throws IOException, WebApplicationException {        if (t instanceof Widget) { Widget widget = (Widget)t; widget.writeTo(out);        } else if (t instanceof WidgetList) { WidgetList list = (WidgetList)t; list.writeTo(out);        }    }  }

TestCase
(确保提供程序已在服务器和客户端上注册)

@Testpublic void testGetIt() {    Client client = ClientBuilder.newClient();    WebTarget target = client.target("http://localhost:8080/api");    // Get all list    WidgetList list = target.path("/widgets").request().get(WidgetList.class);    System.out.println("===== Response from GET =====");    for (Widget widget: list.getWidgetList()) {        System.out.println("id: " + widget.getId()    + ", name: " + widget.getName());    }    // Post one     Widget widget = Widget.newBuilder().setId("10")    .setName("widget 10").build();    Response responseFromPost = target.path("widgets").request() .post(Entity.entity(widget, "application/protobuf"));    System.out.println("===== Response from POST =====");    System.out.println(responseFromPost.readEntity(String.class));    responseFromPost.close();}

结果:

===== Response from GET =====id: 1, name: widget 1id: 2, name: widget 2===== Response from POST =====Saving Widget ID: 10Name: widget 10


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/483554.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号