我们正在使用IBM捆绑的Apache Wink为我们的应用程序提供JAXRS端点。我们正在针对Websphere 8.5.5进行编码。由于我们符合Servlet 3.0,因此我们使用“编程”方式配置JaxRS应用程序,这意味着web.xml中没有条目,并且我们依靠类扫描来获取带注释的jax rs资源。总的来说,它工作正常。

   @ApplicationPath("/api/v1/")
   public class MyApplication  extends Application{

此版本的Websphere和Apache Wink一起使用Jackson 1.6.x进行JSON解串/串行化,并且总体而言效果很好。我们想更改一些对象映射器的默认值

因此,我们定义了一个客户上下文解析器,只需更改一些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);

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

问题是,配置没有被“跟随”,从日志中我可以看到Wink引擎正在查找WinkJacksonProvider,这又..返回遵循Jackson的默认值的JacksonProvider?

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

我试图按此处指示的那样更改Application对象的实现,以便以编程方式配置Provider,但是它不起作用。

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

有任何提示或提示吗?

非常感谢

最佳答案

我仅通过实现MessageBodyWriter类来解决了此问题,如下所示:

import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class DefaultMessageBodyWriter implements MessageBodyWriter<Object> {

    @Override
    public long getSize(Object object, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return -1;
    }

    @Override
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return true;
    }

    @Override
    public void writeTo(Object object, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
        mapper.writeValue(entityStream, object);
    }
}

每次请求JSON序列化时,此类都会起作用,并最终调用其writeTo方法。

在此,应WebSphere的要求,关闭SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS。

关于java - 使用Apache Wink覆盖Websphere 8.5.5上的Jackson对象映射器属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23468429/

10-10 06:29