高枕无忧杰克逊它是如何开箱即用的?

Rest easy and jackson how did it work out of the box?

我试图使用 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>

这是我的服务class

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 使用它。

我知道问题太多了。如果你能把我指向一个正确的 book/link 阅读就足够了。提前致谢。

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 serialization/deserialization 进行任何配置,您可以在 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。然后您需要在 WEB-INF 中设置 jboss-deployment-structure.xml 文件,如前所述 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.

的不同样式配置。

每次请求和响应需要serialization/deserialization时,都会调用getContext方法来检索ObjectMapper


更新

所以经过一些测试,我上面的Maven依赖似乎不在Maven Central中。我猜它在不同的 Repo 中。无论如何,我只是将版本更改为 3.0.9.Final 只是为了获得 Jackson 编译时依赖项。但它仍在提供的范围内,因此不会在部署时使用。 JBoss 将使用内部提供的模块。