高枕无忧杰克逊它是如何开箱即用的?
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 将使用内部提供的模块。
我试图使用 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 将使用内部提供的模块。