Spring RestTemplate с Джексоном выдает «Не удается разрешить BeanPropertyFilter» при использовании @JsonFilter - PullRequest
2 голосов
/ 22 февраля 2012

Могу ли я указать Джексона ObjectMapper, который использует RestTemplate Spring?

Я не на 100%, это то, что мне нужно сделать, но подробности см. Ниже.

Справочная информация: С помощью этого сообщения в StackOverflow Я добавил @JsonFilter в свой класс домена и отредактировал свой веб-сервис jax-rs (реализован в CXF).Теперь я успешно могу динамически выбирать, какие поля класса домена возвращать в моем RESTful API.Пока все хорошо.

Я использую RestTemplate Spring в моих тестах JUnit для тестирования моего RESTful API.Это работало нормально, пока я не добавил @JasonFilter в свой класс домена.Теперь я получаю следующее исключение:

org.springframework.web.client.ResourceAccessException: ошибка ввода-вывода: не удается разрешить BeanPropertyFilter с идентификатором 'apiFilter';не настроен FilterProvider;вложенное исключение: org.codehaus.jackson.map.JsonMappingException: не удается разрешить BeanPropertyFilter с идентификатором «apiFilter»;нет FilterProvider настроен

в org.springframework.web.client.RestTemplate.doExecute (RestTemplate.java:453)

остаток трассировки стека опущен для краткости

Причина:org.codehaus.jackson.map.JsonMappingException: не удается разрешить BeanPropertyFilter с идентификатором 'apiFilter';нет настроенного FilterProvider

в org.codehaus.jackson.map.ser.BeanSerializer.findFilter (BeanSerializer.java:252)

У меня была похожая проблема на стороне сервера иудалось решить его (с помощью этого поста ), дав FilterProvider Джексону ObjectMapper следующим образом:

ObjectMapper mapper = new ObjectMapper();
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));

Могу ли я сделать что-то похожее на RestTemplateбоковая сторона?Любые идеи о том, как решить эту проблему, приветствуются.

Просто чтобы быть ясным, на стороне клиента RestTemplate я не хочу фильтровать свойства объекта домена вообще.

1 Ответ

5 голосов
/ 25 февраля 2012

Могу ли я указать ObjectMapper Джексона, который использует RestTemplate Spring?

Мне удалось заставить RestTemplate использовать настроенный ObjectMapper, выполнив следующие действия:

ObjectMapper mapper = new ObjectMapper();

// set a custom filter
Set<String> filterProperties = new HashSet<String>();
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.serializeAllExcept(filterProperties));
mapper.setFilters(filters);

MappingJacksonHttpMessageConverter messageConverter = new MappingJacksonHttpMessageConverter();
messageConverter.setObjectMapper(mapper);
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(messageConverter);
restTemplate.setMessageConverters(messageConverters);

Этот сайт предоставил пример для части кода выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...