gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:32:26 27 4
gpt4 key购买 nike

我们使用 IBM(s) 捆绑的 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(s) 默认值的 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 方法。

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com