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;
}
}
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
