我正在使用泽西JAX-RS客户端(版本2.0)。我知道它使用Jackson ObjectMapper来生成和解析JSON。我想使用相同的对象为一些java类生成JSON,这样我就可以将它们写入日志。
我知道我可以创建一个新的ObjectMapper实例,但我更喜欢请求泽西客户端给我一个它正在使用的引用。我该怎么做呢?泽西2.0知道Jackson,因为它包含一个JacksonFeature类,该类首先用于配置Jackson功能。
根据此处的其他解决方案(使用jackson 2.8.3),无法访问jersey对象映射器进行配置。(我怀疑这可能与osgi容器有关,但无论如何……)一种强力解决方法是从客户机获取响应对象,并在其上调用您自己的ObjectMapper实例。然后,同样的实例也可以在其他地方与显式配置一起重用。
Client client = ClientBuilder.newClient();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
...
Response r = client.target(URL).request().get();
MyDtoClass dto = mapper.readValue((InputStream)(r.getEntity()), MyDtoClass.class);
Jersey实际上并没有显式地配置ObjectMapper实例,而是委托给JacksonJsonProvider
,后者反过来使用默认的映射器实例。您可以跟踪JacksonProviderProxy代码以了解其工作原理。通过定义上下文解析器,您可以创建和自定义要在整个应用程序中使用的共享映射器:
@Provider
public class ObjectMapperContextResolver implements
ContextResolver<ObjectMapper> {
private ObjectMapper mapper = null;
public ObjectMapperContextResolver() {
super();
// Illustrate configuration of the mapper instance
mapper = new ObjectMapper().configure(
SerializationConfig.Feature.WRAP_ROOT_VALUE, true).configure(
DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
Jackson提供程序将从此解析器检索其映射器实例,您可以在代码中执行相同的操作,如下所示:
public class MyResource {
@Context
private ContextResolver<ObjectMapper> mapperResolver;
public void someResourceMethod() {
final ObjectMapper mapper = mapperResolver.getContext(Object.class);
}
}
我通过添加以下静态成员解决了这个问题:
private static JacksonJsonProvider jackson_json_provider = new JacksonJaxbJsonProvider()
.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
private static ObjectMapper object_mapper = jackson_json_provider.locateMapper(
Object.class, MediaType.APPLICATION_JSON_TYPE);
private static Client client = ClientBuilder.newClient().register(jackson_json_provider);
请注意,不需要第二个声明只是为了配置FAIL_ON_UNKNOWN_PROPERTIES
或FAIL_ON_EMPTY_BEANS
;我使用object_mapper
还有一些其他原因。
问题内容: 我正在使用Jersey JAX- RS客户端(2.0版)。我知道它正在使用Jackson的ObjectMapper生成和解析JSON。我想使用同一对象为某些Java类生成JSON,以便可以将它们写入日志。 我知道我可以创建一个ObjectMapper的新实例,但是我希望请求Jersey Client给我一个有关它正在使用的实例的引用。我怎样才能做到这一点?Jersey 2.0知道Jac
我通过一个spring上下文注入了一个JAX RS客户端,如下所示: 在成功响应(200、202、204)的情况下,如何访问响应状态?
我试图在was 8.5上部署使用jersey的jax-rs客户机应用程序。 我希望我不需要在war中打包jersey JAR,因为was将提供它们。 但在试图调用servlet时,我遇到了这个错误: 我可以做些什么来使用was库,这样我就不需要把它们打包在我的应用程序中了吗?
在移动应用程序和Web服务之间有某种代理,我们在发出发布请求时对响应感到困惑。我们收到状态为200: OK的响应。但是我们找不到/提取JSON响应正文。 我们正在使用JAX-RS。有人能提供一些提示,从服务器响应中提取JSON主体(
运行一个客户端最少需要Jersey框架的哪些JAR文件?如果我包括所有的JAR,它将占用4 MB。
我有一个 JAX-RS 客户端,它正在发出一个简单的 GET 请求。我正在使用CXF实现和Spring for DI。调用成功,我得到的响应代码为 200。但是我在将响应读入我的POJO时遇到错误。 例外: 代码: 在我的类路径中,我有下面这个答案中所建议的依赖项,它似乎不会自动获取。 我还尝试在创建客户端时注册json提供程序: 和 但这些选择都不起作用。当我使用上面的一个选项注册json提供程