Регистратор MappingJackson2HttpMessageConverter в Spring 3.1.2 с аннотациями JAXB
У меня есть несколько сущностей с аннотациями JAXB, которые я хотел бы преобразовать в JSON с помощью конвертера сообщений.
Я знаю, что мой ObjectMapper, который читает аннотации JAXB, работает:
String correctJsonText = jacksonObjectMapper.writeValueAsString(entityWithJAXB);
Но когда я вызываю службу отдыха, зарегистрированный по умолчанию MappingJacksonHttpMessageConverter (который не настроен для чтения JAXB), кажется, вступает во владение - приводя к переполнению стека из-за циклических ссылок, когда @XmlTransient игнорируется ...
Как настроить Spring для использования MappingJackson2HttpMessageConverter?
Текущая конфигурация
ОТДЫХ
@RequestMapping(value="/{id}", method=RequestMethod.GET, produces = "application/json;charset=UTF-8")
public @ResponseBody EntityWithJAXB readEntityWithJAXB(@PathVariable int id, Model model) {
return entityService.getById(id);
}
зависимости
com.fasterxml.jackson.core
jackson-core
2.0.5
com.fasterxml.jackson.core
jackson-databind
2.0.5
com.fasterxml.jackson.module
jackson-module-jaxb-annotations
2.0.5
ОБНОВЛЕНИЕ / Решение
Отладив мой контекст, я увидел, что конфигурация в не имел никакого эффекта.
Оказалось, что мой модульный тест с MockMcv всегда загружал дескрипторы дескрипторов по умолчанию, таким образом игнорируя мой собственный объектный сопоставитель. Из-за удобства я только протестировал контроллер, используя тест junit, так как он попал в контроллер просто отлично, я не думал об этом как о вероятной причине ошибки ...
Я еще не нашел исправления для своего теста, но когда я звоню в службу с помощью curl, все работает!
ОБНОВЛЕНИЕ / Окончательное решение
Только что нашел решение для моей тестовой установки; при использовании MockMvc (spring-test-mvc) вы должны явно указать пользовательские конвертеры сообщений:
private MockMvc mockMvc;
@Autowired
private MappingJackson2HttpMessageConverter jacksonMessageConverter;
@Autowired
private RestController restController;
@Before
public void initMockMvc(){
mockMvc = MockMvcBuilders.standaloneSetup(restController)
.setMessageConverters(jacksonMessageConverter).build();
}
@Test
public void testRestController() throws Exception{
DefaultRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/json/42");
this.mockMvc.perform(requestBuilder).andDo(print()).andExpect(status().isOk());
}
Единственная оставшаяся проблема заключается в том, чтоjacksonMessageConverter
Можно'не может быть подключен напрямую до тех пор, пока не будет разрешена следующая JIRA:https://jira.springsource.org/browse/SPR-9469, До этого я только что создал копию jacksonMessageConverter в моем тестовом контексте.