的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



