首页 > 解决方案 > 验证不适用于 RestController 中的 Map 键

问题描述

使用 Spring Boot 2.2.6,给定这个控制器:

@RestController
@Validated
class MyController {
    @GetMapping("foo")
    fun getFirmwareVersionDifference(
        @RequestParam @Valid versions: @Valid Map<
            @Pattern(regexp = "a|b|c")
            String, String>
    ): String {
       // …
    }
}

我希望请求foo?d=any抛出一个ConstraintViolationException,但控制器被正常调用。

我有一个MethodValidationPostProcessor在我的上下文中,它适用于其他验证。如果我将 RequestParam 更改为@RequestParam @Valid @Length(min=3) installedFirmwareVersion: String它可以按预期工作。

我错过了什么?

标签: spring-bootkotlinbean-validation

解决方案


这是一个 kotlin 编译器错误/缺少的功能:https ://youtrack.jetbrains.com/issue/KT-13228

https://youtrack.jetbrains.com/issue/KT-35843中所述,这在 kotlin 1.3.70 中得到了部分解决。

这是您可以在其中设置编译器标志的方法build.gradle.kts

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xemit-jvm-type-annotations")
        jvmTarget = "11" // at least 8 should work, I only tested 11
    }
}

推荐阅读