@EnableWebFlux на WebFluxConfigurer выполняет автоматическую настройку ThymeleafViewResolver, как и ожидалось - PullRequest
0 голосов
/ 12 апреля 2020

Я создаю 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. Как правильно это сделать?

1 Ответ

0 голосов
/ 13 апреля 2020

Я закончил тем, что 1) переключился на FreeMarker и 2) мне пришлось представить мой пользовательский ObjectMapper как бин, хотя это имело свои проблемы.

...