MOXy Maven 依赖项/更改

MOXy 媒体模块是 Jersey 2.x 中的模块之一,我们无需显式注册它的功能,例如 MoxyJsonFeature
一旦 Jersey 检测到它在类路径中的存在,它会自动注册它。
所以只需在 pom.xml中添加 MOXy 依赖就可以完成一半的工作。

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

测试

在服务器上部署应用程序并点击 URL:http://localhost:8080/JerseyDemos/rest/employees

这将产生以下输出。

{
  "employeeList": [
    {
      "id": 1,
      "name": "JackLi Gupta"
    },
    {
      "id": 2,
      "name": "JackLi Kolenchiskey"
    },
    {
      "id": 3,
      "name": "Tomm Kameron"
    }
  ]
}
欢迎 on it road

手动添加 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;
	}
}

并在 web.xml文件中添加这个 Application 类。

<!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.onitroad.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>

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, "JackLi Gupta"));
		list.getEmployeeList().add(new Employee(2, "JackLi Kolenchiskey"));
		list.getEmployeeList().add(new Employee(3, "Tomm Kameron"));

		return list;
	}
}
如何在 Jersey 2.x 中使用 MOXy JSON

MOXy 是 Jersey 2.x 中默认的 JSON 绑定提供程序。

使用 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 类中的第 1 行。
16.

模型 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 + "]";
	}
}
日期:2020-09-17 00:16:32 来源:oir作者:oir