Jersey + MOXy JSON 示例

Jersey + MOXy JSON 示例

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

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

Table of Contents

MOXy maven dependencies/changes
REST API code
Model bean changes
Manually adding MoxyJsonFeature
Customize behavior using MoxyJsonConfig
Demo

MOXy Maven 依赖项/更改

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

<dependency>
	<groupId>org.glassfish.jersey.media</groupId>
	<artifactId>jersey-media-moxy</artifactId>
	<version>2.19</version>
</dependency>

REST API 代码

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

JerseyService.java

@Path("/employees")
public class JerseyService 
{
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	public Employees getAllEmployees() 
	{
		Employees list = new Employees();
		list.setEmployeeList(new ArrayList<Employee>());

		list.getEmployeeList().add(new Employee(1, "Lokesh Gupta"));
		list.getEmployeeList().add(new Employee(2, "Alex Kolenchiskey"));
		list.getEmployeeList().add(new Employee(3, "David Kameron"));

		return list;
	}
}	

模型 bean 更改

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

Employees.java

public class Employees 
{
	private List<Employee> employeeList;

	public List<Employee> getEmployeeList() {
		return employeeList;
	}

	public void setEmployeeList(List<Employee> employeeList) {
		this.employeeList = employeeList;
	}
}

Employee.java

public class Employee 
{
	private Integer id;
	private String name;

	public Employee() {

	}

	public Employee(Integer id, String name) {
		this.id  = id;
		this.name = name;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Employee [id=" + id + ", name=" + name + "]";
	}
}

手动添加MoxyJsonFeature

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

public class CustomApplication extends Application
{
	//Add Service APIs
	@Override
	public Set<Class<?>> getClasses() 
	{
		Set<Class<?>> resources = new HashSet<Class<?>>();

		//register REST modules
		resources.add(JerseyService.class);

		//Manually adding MOXyJSONFeature
		resources.add(org.glassfish.jersey.moxy.json.MoxyJsonFeature.class);

		//Configure Moxy behavior
		resources.add(JsonMoxyConfigurationContextResolver.class);

		return resources;
	}
}

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

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

	<display-name>Archetype Created Web Application</display-name>

	<servlet>
		<servlet-name>jersey-serlvet</servlet-name>
		<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
		<init-param>
			<param-name>javax.ws.rs.Application</param-name>
			<param-value>com.howtodoinjava.jersey.CustomApplication</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>jersey-serlvet</servlet-name>
		<url-pattern>/rest/*</url-pattern>
	</servlet-mapping>

</web-app>

使用MoxyJsonConfig自定义行为

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

//Register ContextResolver<MoxyJsonConfig> to override 
//default behavior of marshaling/un-marshaling attributes

@Provider
public class JsonMoxyConfigurationContextResolver implements ContextResolver<MoxyJsonConfig> 
{

	private final MoxyJsonConfig config;

	public JsonMoxyConfigurationContextResolver() 
	{
		final Map<String, String> namespacePrefixMapper = new HashMap<String, String>();
		namespacePrefixMapper.put("http://www.w3.org/2001/XMLSchema-instance", "xsi");

		config = new MoxyJsonConfig()
				.setNamespacePrefixMapper(namespacePrefixMapper)
				.setNamespaceSeparator(':')
				.setAttributePrefix("")
				.setValueWrapper("value")
				.property(JAXBContextProperties.JSON_WRAPPER_AS_ARRAY_NAME, true)
				.setFormattedOutput(true)
				.setIncludeRoot(true)
				.setMarshalEmptyCollections(true);
	}

	@Override
	public MoxyJsonConfig getContext(Class<?> objectType) 
	{
		return config;
	}
}

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"
    }
  ]
}

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

Jersey2.x MOXy JSON Demo Application Structure

Jersey2.x MOXy JSON 示例应用结构

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

祝您学习愉快!

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