Jersey 2.6 Jackson 提供商注册
Jersey 2.6 Jackson provider registering
我正在使用 Jersey 2.6 实现 REST Web 服务,
我在注册 Jackson Provider 以获得 JSON 支持时遇到问题,我已根据 jeresy 文档 (https://jersey.java.net/documentation/2.6/user-guide.html#json.jackson) 实施。
- 添加maven依赖-jersey-media-json-jackson
- 实施了 ContextResolver class。
- 用@Provider 注释它以启用"Auto-Discoverable Features"
- web.xml 有提供者的包名classes,所以提供者会在扫描时被注册。
参考:
http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/
出于某种原因,Jackson JSON 提供者未注册,我是否遗漏了什么?
在 Jersey 2.9 之前,该功能不会被自动发现。我们需要 (1) 在 Application/ResourceConfig
子类中显式注册 JacksonFeature
,(2) 在要扫描的包的 web.xml 中列出 Jackson 包,或者 (3) 添加 JacksonFeature到 web.xml
中的提供商列表
应用子类:
public class MyApplication extends ResourceConfig {
public MyApplication() {
// (1)
register(JacksonFeature.class); // <----- Jackson Support
packages("the.package.of.your.resources");
}
}
或web.xml:
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<!-- (2) -->
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
the.package.of.your.resources,
org.codehaus.jackson.jaxrs <!-- Jackson providers -->
</param-value>
</init-param>
<init-param>
<!-- (3) -->
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>
org.glassfish.jersey.jackson.JacksonFeature
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
查看更多详细信息。请注意,对于 ...classnames
属性,如果您有多个提供商要注册,则应将其列在相同的参数值中,并以逗号、分号或换行符分隔。
哦,仅供参考,ContextResolver
只是在可检索的上下文中注册 ObjectMapper
,因此 MessageBodyReader/MessageBodyWriters
可以重用它。但它没有注册 marshalling/unmarshalling.
所需的实际 MessageBodyReader/Writer
您好,我认为以上不是很好的解决方案。
由于我遇到了必须提供球衣 springboot jackson 的相同问题。
以上JacksonFeature.class来自glassfish,它的功能较少,这对未来的springboot应用程序来说是个问题
public class MyApplication extends ResourceConfig {
public MyApplication() {
// (1)
register(ObjectMapperContextResolver.class); // <----- Jackson Support
packages("the.package.of.your.resources");
}
}
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.springframework.beans.factory.annotation.Autowired;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
重要的一点是您需要将 ObjectMapper 导入为 com.fasterxml.jackson.databind.ObjectMapper;对于最新的 springboot Jackson
以防万一有人正在寻找在 Weblogic 12.2.1.4 和 CXF Servlet 2.7.11 上使用 JacksonProvider 生成(序列化)JSON 的功能。这个解决方案与上面 Paul Samsotha 的解决方案几乎相同(顺便说一句,谢谢大家!),但是所有内容都在一个地方提到,所以像我一样迷路的人可以很容易地弄清楚。
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/*-config.xml</param-value>
</context-param>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.myproject.common.application.ApplicationConfig</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.disableMoxyJson</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>org.codehaus.jackson.jaxrs</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
/WEB-INF/conf/app-config.xml
<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
<jaxrs:providers>
<ref bean="objectMapperContextResolver" />
<ref bean="jsonProvider" />
</jaxrs:providers>
自定义 ObjectMapper ContextResolver
package com.myproject.common.provider;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.springframework.stereotype.Component;
@Component("objectMapperContextResolver")
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, false);
mapper.setSerializationInclusion(Inclusion.ALWAYS);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
创建应用程序配置以注册 JacksonFuture 和自定义 ObjectMapperContextResolver
package com.myproject.common.application;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import org.glassfish.jersey.jackson.JacksonFeature;
import com.myproject.common.provider.ObjectMapperContextResolver;
@ApplicationPath("/")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new java.util.HashSet<>();
classes.add(JacksonFeature.class);
classes.add(ObjectMapperContextResolver.class);
return classes;
}
}
在weblogic-application.xml中将Jackson provider包指定为prefer-application-packages,可以在web.xml:
<weblogic-application>
<prefer-application-packages>
<package-name>org.codehaus.jackson.jaxrs.*</package-name>
</prefer-application-packages>
</weblogic-application>
在 pom.xml 中排除任何不必要的球衣依赖并添加以下 org.glassfish.jersey.media 罐子:
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-sse -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-sse</artifactId>
<version>2.0-m10</version>
<exclusions>
<exclusion>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.0-m10</version>
</dependency>
我正在使用 Jersey 2.6 实现 REST Web 服务,
我在注册 Jackson Provider 以获得 JSON 支持时遇到问题,我已根据 jeresy 文档 (https://jersey.java.net/documentation/2.6/user-guide.html#json.jackson) 实施。
- 添加maven依赖-jersey-media-json-jackson
- 实施了 ContextResolver class。
- 用@Provider 注释它以启用"Auto-Discoverable Features"
- web.xml 有提供者的包名classes,所以提供者会在扫描时被注册。
参考: http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/
出于某种原因,Jackson JSON 提供者未注册,我是否遗漏了什么?
在 Jersey 2.9 之前,该功能不会被自动发现。我们需要 (1) 在 Application/ResourceConfig
子类中显式注册 JacksonFeature
,(2) 在要扫描的包的 web.xml 中列出 Jackson 包,或者 (3) 添加 JacksonFeature到 web.xml
应用子类:
public class MyApplication extends ResourceConfig {
public MyApplication() {
// (1)
register(JacksonFeature.class); // <----- Jackson Support
packages("the.package.of.your.resources");
}
}
或web.xml:
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<!-- (2) -->
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
the.package.of.your.resources,
org.codehaus.jackson.jaxrs <!-- Jackson providers -->
</param-value>
</init-param>
<init-param>
<!-- (3) -->
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>
org.glassfish.jersey.jackson.JacksonFeature
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
查看更多详细信息...classnames
属性,如果您有多个提供商要注册,则应将其列在相同的参数值中,并以逗号、分号或换行符分隔。
哦,仅供参考,ContextResolver
只是在可检索的上下文中注册 ObjectMapper
,因此 MessageBodyReader/MessageBodyWriters
可以重用它。但它没有注册 marshalling/unmarshalling.
MessageBodyReader/Writer
您好,我认为以上不是很好的解决方案。 由于我遇到了必须提供球衣 springboot jackson 的相同问题。
以上JacksonFeature.class来自glassfish,它的功能较少,这对未来的springboot应用程序来说是个问题
public class MyApplication extends ResourceConfig {
public MyApplication() {
// (1)
register(ObjectMapperContextResolver.class); // <----- Jackson Support
packages("the.package.of.your.resources");
}
}
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.springframework.beans.factory.annotation.Autowired;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
重要的一点是您需要将 ObjectMapper 导入为 com.fasterxml.jackson.databind.ObjectMapper;对于最新的 springboot Jackson
以防万一有人正在寻找在 Weblogic 12.2.1.4 和 CXF Servlet 2.7.11 上使用 JacksonProvider 生成(序列化)JSON 的功能。这个解决方案与上面 Paul Samsotha 的解决方案几乎相同(顺便说一句,谢谢大家!),但是所有内容都在一个地方提到,所以像我一样迷路的人可以很容易地弄清楚。
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/*-config.xml</param-value>
</context-param>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.myproject.common.application.ApplicationConfig</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.disableMoxyJson</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>org.codehaus.jackson.jaxrs</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
/WEB-INF/conf/app-config.xml
<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
<jaxrs:providers>
<ref bean="objectMapperContextResolver" />
<ref bean="jsonProvider" />
</jaxrs:providers>
自定义 ObjectMapper ContextResolver
package com.myproject.common.provider;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.springframework.stereotype.Component;
@Component("objectMapperContextResolver")
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, false);
mapper.setSerializationInclusion(Inclusion.ALWAYS);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
创建应用程序配置以注册 JacksonFuture 和自定义 ObjectMapperContextResolver
package com.myproject.common.application;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import org.glassfish.jersey.jackson.JacksonFeature;
import com.myproject.common.provider.ObjectMapperContextResolver;
@ApplicationPath("/")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new java.util.HashSet<>();
classes.add(JacksonFeature.class);
classes.add(ObjectMapperContextResolver.class);
return classes;
}
}
在weblogic-application.xml中将Jackson provider包指定为prefer-application-packages,可以在web.xml:
<weblogic-application>
<prefer-application-packages>
<package-name>org.codehaus.jackson.jaxrs.*</package-name>
</prefer-application-packages>
</weblogic-application>
在 pom.xml 中排除任何不必要的球衣依赖并添加以下 org.glassfish.jersey.media 罐子:
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-sse -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-sse</artifactId>
<version>2.0-m10</version>
<exclusions>
<exclusion>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.0-m10</version>
</dependency>