使用Apache Wink覆盖Websphere 8.5.5上的Jackson Object Mapper属性

jav*_*apo 7 java jax-rs jackson apache-wink websphere-8

我们正在使用IBM捆绑的Apache Wink为我们的应用程序提供JAXRS端点.我们正在编写Websphere 8.5.5.由于我们符合servlet 3.0,因此我们使用"编程"方式配置JaxRS应用程序,这意味着web.xml中没有条目,我们依赖类扫描来注释jax rs资源.一般来说它工作正常.

   @ApplicationPath("/api/v1/") 
   public class MyApplication  extends Application{
Run Code Online (Sandbox Code Playgroud)

这个版本的Websphere和Apache Wink一起使用Jackson 1.6.x进行JSON de/serialization,一般来说效果很好.我们希望改变Object Mapper的一些默认值

因此,我们定义了一个客户上下文解析器,只需更改一些se/deserialzation属性.

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class CustomJackssonConverter implements ContextResolver<ObjectMapper> {

    final ObjectMapper defaultObjectMapper;

    public AibasJackssonConverter() {
        defaultObjectMapper = createDefaultMapper();
    }
   ...       
 mapper.getSerializationConfig().set(SerializationConfig.Feature.INDENT_OUTPUT, true);
Run Code Online (Sandbox Code Playgroud)

在JAX-RS调用期间,我们可以看到容器注册了新的Provider,没有错误

问题是,配置没有"跟随",从日志中我可以看到Wink引擎正在查找WinkJacksonProvider,而这反过来又回复了一个遵循Jackson(s)默认值的JacksonProvider?

有没有办法只更改此默认值?

我试图更改此处所示的Application对象的实现,以便以编程方式配置Providers,但它不起作用.

http://www.ibm.com/developerworks/java/library/wa-aj-jackson/index.html

任何提示或提示?

非常感谢

Chr*_*ris -1

我在 WAS v8.0.0.x 中使用 MOXy 而不是 Jackson。

为了覆盖 Jackson,我按如下方式实现我的 Application 类:

@Named
@ApplicationScoped
@ApplicationPath("/resources/")
public class WinkApplication extends Application implements Serializable {

private static final long serialVersionUID = 1L;

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> classes = new HashSet<Class<?>>();
    classes.add(WinkResource.class);
    classes.add(WinkMOXyJsonProvider.class);
    classes.add(WinkResponseException.class);
    classes.add(WinkResponseExceptionMapper.class);
    return classes;
}
}
Run Code Online (Sandbox Code Playgroud)

但是,我注意到 WAS 似乎忽略了以下注释:

@ApplicationPath("/resources/")
Run Code Online (Sandbox Code Playgroud)

因此,我求助于使用 web.xml:

<!-- Wink Servlet -->
<servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.company.team.project.webservices.config.WinkApplication</param-value>
    </init-param>
    <!-- <init-param>
        <param-name>propertiesLocation</param-name>
        <param-value>/WEB-INF/my-wink-properties.properties</param-value>
    </init-param> -->
    <load-on-startup>1</load-on-startup>
    <enabled>true</enabled>
    <async-supported>false</async-supported>
</servlet>

<!-- Wink Servlet Mapping -->
<servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

重点是,由于 WAS 或 Wink 在使用 ApplicationPath 注解时似乎忽略了 Application 实现,因此 Wink 加载默认的 Application 类,该类默认使用 Jackson。

是的,我读过文档,甚至在线观看了 IBM 视频,其中提到 @ApplicationPath 允许您避免 XML 配置,但是这个问题似乎是一个错误。

更新:

另一种方法可能是 David Blevins 在另一篇 SO 帖子中提到的方法。

查看使用 JAX-RS 部分