我们正在使用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/