如何从JAX-RS客户端提取ObjectMapper?

nec*_*cer 11 json jax-rs jersey jackson jersey-client

我正在使用Jersey JAX-RS客户端(版本2.0).我知道它使用Jackson ObjectMapper来生成和解析JSON.我想使用同一个对象为某些java类生成JSON,以便我可以将它们写入日志.

我知道我可以创建一个新的ObjectMapper实例,但我更愿意请求Jersey客户端给我一个它正在使用的实例.我怎样才能做到这一点?Jersey 2.0知道Jackson,因为它包含一个JacksonFeature类,用于首先配置Jackson功能.

nec*_*cer 19

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

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);
Run Code Online (Sandbox Code Playgroud)

请注意,仅配置FAIL_ON_UNKNOWN_PROPERTIES或不需要第二个声明FAIL_ON_EMPTY_BEANS; 我用object_mapper其他一些原因.


Per*_*ion 17

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jackson提供程序将从此解析程序中检索其映射器实例,您可以在代码中执行相同操作,如下所示:

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

    public void someResourceMethod() {
        final ObjectMapper mapper = mapperResolver.getContext(Object.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,看看依赖注射,我想知道你的方法是否适用于球衣客户端?还是只有泽西服务器? (2认同)