Я написал небольшой тест в документах Spring REST с пользовательским модулем Jackson (используя Spring Boot 1.3). В моем основном классе приложений у меня есть только @SpringBootApplication
. Я тогда еще один класс JacksonCustomizations
который выглядит следующим образом:Пользовательский модуль Jackson не используется в Spring REST docs test
@Configuration
public class JacksonCustomizations {
@Bean
public Module myCustomModule() {
return new MyCustomModule();
}
static class MyCustomModule extends SimpleModule {
public MyCustomModule() {
addSerializer(ImmutableEntityId.class, new JsonSerializer<ImmutableEntityId>() {
@Override
public void serialize(ImmutableEntityId immutableEntityId, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeNumber((Long)immutableEntityId.getId());
}
});
}
}
}
Эта настройка подобрано идеально. Когда я запускаю приложение Spring Boot, я вижу JSON, как и должно быть.
Однако в моем тестировании документации настройка не применяется. Это код моего теста:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration
@WebAppConfiguration
public class NoteControllerDocumentation {
@Rule
public final RestDocumentation restDocumentation = new RestDocumentation("target/generated-snippets");
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(documentationConfiguration(restDocumentation))
.build();
}
@Test
public void notesListExample() throws Exception {
mockMvc.perform(get("/api/notes/"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andDo(document("notes-list-example", responseFields(
fieldWithPath("[]").description("An array of <<note-example,note>>s."))));
}
@Configuration
@EnableWebMvc
@Import(JacksonCustomizations.class)
public static class TestConfiguration {
@Bean
public NoteController noteController() {
return new NoteController();
}
}
}
Обратите внимание, как контекст приложения в моем тесте импортирует конфигурацию JacksonCustomizations
.
Другие вещи, которые я нашел:
- Добавление
@EnableWebMvc
на моей загрузки приложения останавливает настройки от работы. - Снятие
@EnableWebMvc
на моих тестовых остановках производится JSON.
Вы пытались добавить класс @Import (JacksonCustomizations.class) в класс NoteControllerDocumentation? – reos
@reos не имеет значения –
Похоже, Spring Boot не настроил автоматическую настройку «ObjectMapper» с помощью вашего собственного «модуля». Это соответствует тому, что вы не предоставили «SpringApplicationConfiguration» классу (-ам) для вашего приложения, поэтому Spring Boot не знает, что делать. Фактически, код, который вы разделили, с ошибкой «IllegalStateException», который говорит «Нет классов конфигурации или местоположений, найденных в @SpringApplicationConfiguration» из-за этого. Можете ли вы поделиться небольшим образцовым проектом, который содержит точный код, который вы запускаете, чтобы вызвать проблему? –