Использование ContextResolver для регистрации ObjectMapper во время выполнения - PullRequest
0 голосов
/ 19 июня 2020

Мы используем JAX-RS (реализация на Джерси) для вызова внешних систем. При создании клиента JAX-RS я регистрирую приведенный ниже преобразователь контекста для использования настраиваемого ObjectMapper:

public class JacksonObjectMapperProvider implements ContextResolver<ObjectMapper>
{

    @Override
    public ObjectMapper getContext(Class<?> type) 
    {
        ObjectMapper mapper = new ObjectMapper();

        mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
        mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
        mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
        mapper.configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, true);
        mapper.setSerializationInclusion(Include.NON_NULL);

        return mapper;
    }   
}

Но я не хочу, чтобы ObjectMapper был определен в JacksonObjectMapperProvider. Я хочу, чтобы JacksonObjectMapperProvider мог извлекать его во время выполнения откуда-то или попросил кого-нибудь установить ObjectMapper на JacksonObjectMapperProvider.

Я не могу сделать что-то подобное ниже, потому что ObjectMapper определен в некотором экземпляре, который создает jax-rs Клиент. И здесь у меня нет ссылки на этот экземпляр:

public class JacksonObjectMapperProvider implements ContextResolver<ObjectMapper>
{

    @Override
    public ObjectMapper getContext(Class<?> type) 
    {
        return someService.getObjectMapper();
    }   
}

Есть другой способ сделать это? Есть ли способ передать данные в JacksonObjectMapperProvider при регистрации на клиенте?

1 Ответ

0 голосов
/ 19 июня 2020

Решение проще, чем я думал, вместо регистрации класса:

ClientConfig clConfig = new ClientConfig();
client.register(JacksonObjectMapperProvider.class);

, как это сделал я, вы можете зарегистрировать экземпляр класса и при создании экземпляра передать все, что захотите:

ClientConfig clConfig = new ClientConfig();
client.register(new JacksonObjectMapperProvider(objectMapper));

Обновленный провайдер:

public class JacksonObjectMapperProvider implements ContextResolver<ObjectMapper>
{

    private ObjectMapper mapper;

    public JacksonObjectMapperProvider(ObjectMapper mapper)
    {
        this.mapper = mapper;
    }

    @Override
    public ObjectMapper getContext(Class<?> type) 
    {
        return mapper;
    }   
}
...