原文: https://howtodoinjava.com/jersey/jax-rs-gson-example/

本教程说明如何将 google Gson 与 Jersey2.x 结合使用。 还有其他一些 Java 库也可以执行此转换,例如 MOXy ,Jackson 或 JSONP ; 但是 Gson 很少需要任何预先注解的 Java 类或 Java 类源代码。

  1. Table of Contents
  2. Maven dependencies/changes
  3. Create Gson Provider
  4. Register Gson Provider
  5. Extending Gson Functionality
  6. Demo

Jersey(Jersey)不提供对 Gson 的任何内置支持,因为它提供了 MOXy 和 JSONP 等。但是,Jersey(Jersey)提供了发现机制,可通过实现一些接口并将实现注册到应用配置中来扫描应用的各种可配置组件。

通过实现接口javax.ws.rs.ext.MessageBodyWriterjavax.ws.rs.ext.MessageBodyReader,可以将 Gson 与 Jersey 一起用作 JSON 序列化器/反序列化器,并可以使用@Provider注解或ResourceConfig.register()方法注册配置。

让我们一步一步地查看所有步骤。

Maven 依赖

首先包括 Gson 依赖项。

  1. <dependency>
  2. <groupId>com.google.code.gson</groupId>
  3. <artifactId>gson</artifactId>
  4. <version>2.2.4</version>
  5. </dependency>

创建 Gson 供应器

现在,创建一个实现接口javax.ws.rs.ext.MessageBodyWriterjavax.ws.rs.ext.MessageBodyReader的类,并覆盖其方法。

  1. package com.howtodoinjava.jersey.provider;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.io.OutputStreamWriter;
  7. import java.io.UnsupportedEncodingException;
  8. import java.lang.annotation.Annotation;
  9. import java.lang.reflect.Type;
  10. import javax.ws.rs.WebApplicationException;
  11. import javax.ws.rs.core.MediaType;
  12. import javax.ws.rs.core.MultivaluedMap;
  13. import javax.ws.rs.ext.MessageBodyReader;
  14. import javax.ws.rs.ext.MessageBodyWriter;
  15. import com.google.gson.FieldNamingPolicy;
  16. import com.google.gson.Gson;
  17. import com.google.gson.GsonBuilder;
  18. public class GsonMessageBodyHandler implements MessageBodyWriter<Object>,
  19. MessageBodyReader<Object> {
  20. private static final String UTF_8 = "UTF-8";
  21. private Gson gson;
  22. //Customize the gson behavior here
  23. private Gson getGson() {
  24. if (gson == null) {
  25. final GsonBuilder gsonBuilder = new GsonBuilder();
  26. gson = gsonBuilder.disableHtmlEscaping()
  27. .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
  28. .setPrettyPrinting()
  29. .serializeNulls()
  30. .create();
  31. }
  32. return gson;
  33. }
  34. @Override
  35. public boolean isReadable(Class<?> type, Type genericType,
  36. java.lang.annotation.Annotation[] annotations, MediaType mediaType) {
  37. return true;
  38. }
  39. @Override
  40. public Object readFrom(Class<Object> type, Type genericType,
  41. Annotation[] annotations, MediaType mediaType,
  42. MultivaluedMap<String, String> httpHeaders, InputStream entityStream) {
  43. InputStreamReader streamReader = null;
  44. try {
  45. streamReader = new InputStreamReader(entityStream, UTF_8);
  46. } catch (UnsupportedEncodingException e) {
  47. e.printStackTrace();
  48. }
  49. try {
  50. Type jsonType;
  51. if (type.equals(genericType)) {
  52. jsonType = type;
  53. } else {
  54. jsonType = genericType;
  55. }
  56. return getGson().fromJson(streamReader, jsonType);
  57. } finally {
  58. try {
  59. streamReader.close();
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. }
  63. }
  64. }
  65. @Override
  66. public boolean isWriteable(Class<?> type, Type genericType,
  67. Annotation[] annotations, MediaType mediaType) {
  68. return true;
  69. }
  70. @Override
  71. public long getSize(Object object, Class<?> type, Type genericType,
  72. Annotation[] annotations, MediaType mediaType) {
  73. return -1;
  74. }
  75. @Override
  76. public void writeTo(Object object, Class<?> type, Type genericType,
  77. Annotation[] annotations, MediaType mediaType,
  78. MultivaluedMap<String, Object> httpHeaders,
  79. OutputStream entityStream) throws IOException,
  80. WebApplicationException {
  81. OutputStreamWriter writer = new OutputStreamWriter(entityStream, UTF_8);
  82. try {
  83. Type jsonType;
  84. if (type.equals(genericType)) {
  85. jsonType = type;
  86. } else {
  87. jsonType = genericType;
  88. }
  89. getGson().toJson(object, jsonType, writer);
  90. } finally {
  91. writer.close();
  92. }
  93. }
  94. }

注册 Gson 供应器

现在使用应用资源配置在上述类中注册。

  1. package com.howtodoinjava.jersey;
  2. import org.glassfish.jersey.filter.LoggingFilter;
  3. import org.glassfish.jersey.server.ResourceConfig;
  4. import com.howtodoinjava.jersey.provider.GsonMessageBodyHandler;
  5. public class CustomApplication extends ResourceConfig
  6. {
  7. public CustomApplication()
  8. {
  9. packages("com.howtodoinjava.jersey");
  10. register(LoggingFilter.class);
  11. register(GsonMessageBodyHandler.class);
  12. }
  13. }

扩展 Gson 功能

您可以随时在GsonMessageBodyHandler.getGson()方法中扩展/自定义 Gson 行为。

  1. private Gson getGson() {
  2. if (gson == null) {
  3. final GsonBuilder gsonBuilder = new GsonBuilder();
  4. gson = gsonBuilder.disableHtmlEscaping()
  5. .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
  6. .setPrettyPrinting()
  7. .serializeNulls()
  8. .create();
  9. }
  10. return gson;
  11. }

演示

现在,如果您通过任何 REST 客户端访问任何 REST 资源,您将获得所需的 JSON 输出。

点击 URL:http://localhost:8080/JerseyDemos/rest/employees

现在的输出将是:

  1. {
  2. "EmployeeList": [
  3. {
  4. "Id": 1,
  5. "Name": "Lokesh Gupta"
  6. },
  7. {
  8. "Id": 2,
  9. "Name": "Alex Kolenchiskey"
  10. },
  11. {
  12. "Id": 3,
  13. "Name": "David Kameron"
  14. }
  15. ]
  16. }

祝您学习愉快!