我试图使用RestEasy创建一个休息服务,它会产生JSON输出。我使用了RestEasy 2.2.1.GA + JBoss 7.1。我没有在我的POM文件中配置任何Jacson依赖项,也没有在我的web.xml文件中配置与Jacskon相关的任何内容,但JSON转换对我来说是开箱即用的。这是我的web.xml
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Restful Web Application</display-name>
<!-- Auto scan REST service -->
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<!-- this need same with resteasy servlet url-pattern -->
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
这是我的服务类
package com.ajbose.test;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/message")
public class MessageRestService {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Student printMessage() {
Student student = new Student("Ajay","bose",12,21);
return student;
}
}
它是如何工作的? 即使在我遵循的示例中,我也无法找到任何用于数据绑定的jacskon配置。
我想使用https://github.com/FasterXML/jackson-databind进行JSON转换。我需要更改哪些配置,以便Appserver可以使用它。
我知道它的问题太多了。如果你能指出我正确的书/链接阅读就足够了。在此先感谢。
答案 0 :(得分:2)
默认情况下,Resteasy配置为支持Jackson 1.x开箱即用。它有这个模块
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>2.2.1.GA</version>
<scope>provided</scope>
</dependency>
配置了Jackson依赖项。如果要对Jackson序列化/反序列化进行任何配置,可以在provided
范围内添加该Maven工件。然后在ContextResolver
内配置ObjectMapper
。例如
@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
// configure mapper
}
@Override
public ObjectMapper getContext(Class<?> cls) {
return mapper;
}
}
应使用ContextResolver
注释从扫描中选取@Provider
。
注意以上是使用Jackson 1.x(Codehaus版本)。要使用FasterXml版本,请使用
而不是上述依赖项<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>2.2.1.GA</version>
<scope>provided</scope>
</dependency>
唯一不同的是jackson2
。然后,您需要在jboss-deployment-structure.xml
中设置WEB-INF
文件,如上所述here
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.jboss.resteasy.resteasy-jackson-provider"/>
</exclusions>
<dependencies>
<module name="org.jboss.resteasy.resteasy-jackson2-provider" services="import"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
在这里,您基本上禁用默认的Jackson 1.x并部署2.x.无论哪种方式,ContextResolver
都会非常相似,除了不同的ObjectMapper
命名空间,当然还有ObjectMapper
的不同样式配置。
每次需要对请求和响应进行序列化/反序列化时,将调用getContext
方法来检索ObjectMapper
。
<强>更新强>
因此经过一些测试后,我上面的Maven依赖似乎不在Maven中心。我猜它是在一个不同的回购。无论如何,我只是将版本更改为3.0.9.Final
以获得Jackson编译时依赖项。但它仍处于提供的范围内,因此不会用于部署。 JBoss将在内部使用它提供模块。