Я создаю REST API, начиная с spring-boot-starter-webflux, но я также хотел бы, чтобы приложение обслуживало изящный пользовательский интерфейс с помощью веб-фляги. Мне нужно настроить инициализацию пользовательского интерфейса, поэтому я создал @Controller, который возвращает Mono для запуска рендеринга представления. REST API также нуждается в настраиваемом объекте Джексона ObjectMapper с включенной стратегией именования корпусов змей, среди прочего.
Spring Boot Docs говорят, что для достижения sh это я должен предоставить @ Класс конфигурации, который расширяет WebFluxConfigurer, но я должен оставить @EnableWebflux выключенным. Вот что у меня есть (Kotlin):
Конфиг
@Configuration
@ComponentScan
class CommonConfig : WebFluxConfigurer {
override fun configureHttpMessageCodecs(configurer: ServerCodecConfigurer) {
configurer.defaultCodecs().jackson2JsonDecoder(
Jackson2JsonDecoder(objectMapper())
)
configurer.defaultCodecs().jackson2JsonEncoder(
Jackson2JsonEncoder(objectMapper())
)
}
private fun objectMapper() = Jackson2ObjectMapperBuilder
.json()
.propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.build<ObjectMapper>().also {
it.configOverride(BigDecimal::class.java).format = JsonFormat.Value.forShape(JsonFormat.Shape.STRING)
}
}
Контроллер
@Controller
class SwaggerController(
val swaggerConfig: SwaggerConfig
) {
@GetMapping("/swagger-ui")
fun swagger(model: Model): Mono<String> {
model.addAttribute("docUrl", swaggerConfig.docUrl)
return Mono.just("swagger-ui")
}
}
С этой конфигурацией, вид Swagger отображается хорошо, но когда я пытаюсь отправить сообщение на одну из моих конечных точек API, он жалуется на отсутствие обязательных свойств (что решается отправкой данных в случае верблюда, а не в случае змеи, который я хочу). Если я добавлю @EnableWebFlux в свой класс CommonConfig, пользовательский объект сопоставления будет выбран, и я смогу отправлять данные о случаях змеи, но тогда представление чванства не отображается. Я получаю:
java.lang.IllegalStateException: Could not resolve view with name 'swagger-ui'.
at org.springframework.web.reactive.result.view.ViewResolutionResultHandler.lambda$resolveViews$3(ViewResolutionResultHandler.java:278) ~[spring-webflux-5.2.5.RELEASE.jar:5.2.5.RELEASE]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Это, вероятно, потому, что ViewResolver не зарегистрирован как тимьяновый лист.
В документах сказано, что если я хочу "получить полный контроль над Spring WebFlux, вы можете добавить свой собственная @Configuration с комментариями @EnableWebFlux ", которая объясняет, почему нет ViewResolver. Но это не то, что я хочу. Мне нужна большая часть автоконфигурации webflux, но я хочу предоставить свой собственный настраиваемый ObjectMapper. Как правильно это сделать?