WebFluxConfigurer 上的 @EnableWebFlux 会按预期自动配置 ThymeleafViewResolver

@EnableWebFlux on a WebFluxConfigurer does autoconfigure a ThymeleafViewResolver as expected

我正在构建一个 REST api 从 spring-boot-starter-webflux 开始,但我也希望该应用程序能够使用 webjar 提供 swagger UI .我需要调整 swagger UI 的初始化方式,所以我制作了一个 @Controller returns 一个 Mono 来触发渲染视图。 REST api 还需要一个自定义的 jackson ObjectMapper,其中启用了 snake case 命名策略。

Spring Boot Docs 说要完成这个,我应该提供一个扩展 WebFluxConfigurer 的 @Configuration class,但我应该关闭 @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 视图呈现良好,但是当我尝试 post 到我的 api 端点之一时,它抱怨缺少必需的属性(通过发送数据解决骆驼外壳而不是我想要的蛇外壳)。如果我将 @EnableWebFlux 添加到我的 CommonConfig class,自定义对象映射器将被拾取并且我可以发送 snake case 数据,但是 swagger 视图不会呈现。我得到:

java.lang.IllegalStateException: Could not resolve view with name 'swagger-ui'.
    at org.springframework.web.reactive.result.view.ViewResolutionResultHandler.lambda$resolveViews(ViewResolutionResultHandler.java:278) ~[spring-webflux-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:

这大概是因为没有注册 thymeleaf ViewResolver。

文档确实说如果我想 "take complete control of Spring WebFlux, you can add your own @Configuration annotated with @EnableWebFlux",这就解释了为什么没有 ViewResolver。但这不是我想要的。我想要大部分的 webflux 自动配置,但我想提供我自己定制的 ObjectMapper。正确的做法是什么?

我最终 1) 切换到 FreeMarker 和 2) 需要将我的自定义 ObjectMapper 作为 bean 公开,尽管这有其自身的问题。