休息容易和杰克逊如何开箱即用?

时间:2015-05-28 06:03:45

标签: rest jboss jackson jax-rs resteasy

我试图使用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可以使用它。

我知道它的问题太多了。如果你能指出我正确的书/链接阅读就足够了。在此先感谢。

1 个答案:

答案 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将在内部使用它提供模块。