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) 实施。

  1. 添加maven依赖-jersey-media-json-jackson
  2. 实施了 ContextResolver class。
  3. 用@Provider 注释它以启用"Auto-Discoverable Features"
  4. 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>