spring-boot - 验证不适用于 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
它可以按预期工作。
我错过了什么?
解决方案
这是一个 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
}
}
推荐阅读
- java - 线程“main”java.lang.NumberFormatException 中的异常:对于输入字符串:“3727284434”
- gnuplot - 避免在 gnuplot 中剪切轴编号
- excel - 使用 B 列中的 Excel 数据搜索网站;将搜索结果保存在 C 和 D 列中
- javascript - 如何仅在按下输入按钮时禁用表单提交
- python - 有什么好主意来衡量用户在队列中等待的时间吗?(Python)
- highcharts - HighStock 不绘制注释/注释离开视口?
- typescript - 错误:使用装饰器时找不到模块
- javascript - 使用javascript删除项目并创建表
- python - Opencv轮廓排序
- spring-boot - NGINX + Reactive websocket spring boot websocket server 使用nginx server进行负载均衡