如何从JAX-RS客户端提取ObjectMapper?(How to extract ObjectM

2019-09-02 00:01发布

我使用的泽西JAX-RS客户端(版本2.0)。 我知道它使用的是杰克逊ObjectMapper生成和解析JSON。 我想使用相同的对象,生成JSON的一些Java类,这样我可以将它们写入日志。

我知道我可以创建ObjectMapper的新实例,但我更愿意要求Jersey客户端给我它使用的是一个参考。 我怎样才能做到这一点? 新泽西州2.0是知道杰克逊的,因为它包括用于配置杰克逊功能在首位JacksonFeature类。

Answer 1:

我解决了这个通过添加下列静态成员:

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_PROPERTIESFAIL_ON_EMPTY_BEANS ; 我用object_mapper其他原因。



Answer 2:

新泽西州实际上并没有明确的配置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;
    }
}

杰克逊提供商将从该解析器检索其映射器实例,你可以做同样的在你的代码,像这样:

public class MyResource {
    @Context
    private ContextResolver<ObjectMapper> mapperResolver;

    public void someResourceMethod() {
        final ObjectMapper mapper = mapperResolver.getContext(Object.class);
    }
}


Answer 3:

没能去的球衣对象映射器进行配置,根据这里的其他解决方案(使用杰克逊2.8.3)。 (我怀疑它可能与OSGi容器,但仍然...)周围有一个强力的办法是从客户端获取Response对象并调用它自己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);


文章来源: How to extract ObjectMapper from JAX-RS Client?