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

本教程说明如何在 Jersey2.x 中使用 MOXy JSON 功能。 MOXy 是 Jersey2.x 中的默认 JSON 绑定供应器。 尽管由于性能原因,我个人还是更喜欢 Jackson,而不是 MOXy。

  1. Table of Contents
  2. MOXy maven dependencies/changes
  3. REST API code
  4. Model bean changes
  5. Manually adding MoxyJsonFeature
  6. Customize behavior using MoxyJsonConfig
  7. Demo

MOXy Maven 依赖项/更改

MOXy 媒体模块是 Jersey2.x 中的模块之一,您无需在其中明确注册其功能,例如MoxyJsonFeature。 一旦 Jersey 检测到添加了它的存在,它就会自动注册。 因此,只需在pom.xml中添加 MOXy 依赖项就可以完成一半的工作。

  1. <dependency>
  2. <groupId>org.glassfish.jersey.media</groupId>
  3. <artifactId>jersey-media-moxy</artifactId>
  4. <version>2.19</version>
  5. </dependency>

REST API 代码

在编写 API 的服务端,您需要使用@Produces(MediaType.APPLICATION_JSON)注解启用 JSON 媒体类型。

JerseyService.java

  1. @Path("/employees")
  2. public class JerseyService
  3. {
  4. @GET
  5. @Produces(MediaType.APPLICATION_JSON)
  6. public Employees getAllEmployees()
  7. {
  8. Employees list = new Employees();
  9. list.setEmployeeList(new ArrayList<Employee>());
  10. list.getEmployeeList().add(new Employee(1, "Lokesh Gupta"));
  11. list.getEmployeeList().add(new Employee(2, "Alex Kolenchiskey"));
  12. list.getEmployeeList().add(new Employee(3, "David Kameron"));
  13. return list;
  14. }
  15. }

模型 bean 更改

在模型 bean 方面,您无需放置任何注解或任何配置。 默认情况下它将起作用。 您甚至也不需要添加任何根注解。

Employees.java

  1. public class Employees
  2. {
  3. private List<Employee> employeeList;
  4. public List<Employee> getEmployeeList() {
  5. return employeeList;
  6. }
  7. public void setEmployeeList(List<Employee> employeeList) {
  8. this.employeeList = employeeList;
  9. }
  10. }

Employee.java

  1. public class Employee
  2. {
  3. private Integer id;
  4. private String name;
  5. public Employee() {
  6. }
  7. public Employee(Integer id, String name) {
  8. this.id = id;
  9. this.name = name;
  10. }
  11. public Integer getId() {
  12. return id;
  13. }
  14. public void setId(Integer id) {
  15. this.id = id;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. @Override
  24. public String toString() {
  25. return "Employee [id=" + id + ", name=" + name + "]";
  26. }
  27. }

手动添加MoxyJsonFeature

尽管MoxyJsonFeature是自动注册的,但是如果您希望手动注册,则可以按以下配置添加它。

  1. public class CustomApplication extends Application
  2. {
  3. //Add Service APIs
  4. @Override
  5. public Set<Class<?>> getClasses()
  6. {
  7. Set<Class<?>> resources = new HashSet<Class<?>>();
  8. //register REST modules
  9. resources.add(JerseyService.class);
  10. //Manually adding MOXyJSONFeature
  11. resources.add(org.glassfish.jersey.moxy.json.MoxyJsonFeature.class);
  12. //Configure Moxy behavior
  13. resources.add(JsonMoxyConfigurationContextResolver.class);
  14. return resources;
  15. }
  16. }

并将此Application类添加到web.xml文件中。

  1. <!DOCTYPE web-app PUBLIC
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
  4. <web-app>
  5. <display-name>Archetype Created Web Application</display-name>
  6. <servlet>
  7. <servlet-name>jersey-serlvet</servlet-name>
  8. <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  9. <init-param>
  10. <param-name>javax.ws.rs.Application</param-name>
  11. <param-value>com.howtodoinjava.jersey.CustomApplication</param-value>
  12. </init-param>
  13. <load-on-startup>1</load-on-startup>
  14. </servlet>
  15. <servlet-mapping>
  16. <servlet-name>jersey-serlvet</servlet-name>
  17. <url-pattern>/rest/*</url-pattern>
  18. </servlet-mapping>
  19. </web-app>

使用MoxyJsonConfig自定义行为

MOXy 在 JAXB 之上提供了某些功能,您可以通过提供MoxyJsonConfig实现来启用/禁用这些功能。

  1. //Register ContextResolver<MoxyJsonConfig> to override
  2. //default behavior of marshaling/un-marshaling attributes
  3. @Provider
  4. public class JsonMoxyConfigurationContextResolver implements ContextResolver<MoxyJsonConfig>
  5. {
  6. private final MoxyJsonConfig config;
  7. public JsonMoxyConfigurationContextResolver()
  8. {
  9. final Map<String, String> namespacePrefixMapper = new HashMap<String, String>();
  10. namespacePrefixMapper.put("http://www.w3.org/2001/XMLSchema-instance", "xsi");
  11. config = new MoxyJsonConfig()
  12. .setNamespacePrefixMapper(namespacePrefixMapper)
  13. .setNamespaceSeparator(':')
  14. .setAttributePrefix("")
  15. .setValueWrapper("value")
  16. .property(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, true)
  17. .setFormattedOutput(true)
  18. .setIncludeRoot(true)
  19. .setMarshalEmptyCollections(true);
  20. }
  21. @Override
  22. public MoxyJsonConfig getContext(Class<?> objectType)
  23. {
  24. return config;
  25. }
  26. }

JsonMoxyConfigurationContextResolver已被添加到上面的CustomApplication类中的行号 16。

演示

只需将您的应用部署在任何服务器上,然后单击 URL:http://localhost:8080/JerseyDemos/rest/employees

这将产生以下输出。

{
  "employeeList": [
    {
      "id": 1,
      "name": "Lokesh Gupta"
    },
    {
      "id": 2,
      "name": "Alex Kolenchiskey"
    },
    {
      "id": 3,
      "name": "David Kameron"
    }
  ]
}

以下是演示应用中上述文件的层次结构。

Jersey   MOXy JSON 示例 - 图1

Jersey2.x MOXy JSON 示例应用结构

在下面将您的问题和评论发送给我。

祝您学习愉快!

参考https://jersey.java.net/documentation/latest/media.html#json.moxy