Spring boot RestController中的映射键无法验证
使用Spring Boot 2.2.6,给定此控制器:Spring boot RestController中的映射键无法验证,spring-boot,kotlin,bean-validation,Spring Boot,Kotlin,Bean Validation,使用Spring Boot 2.2.6,给定此控制器: @RestController @验证 类MyController{ @GetMapping(“foo”) 有趣的固件版本差异( @RequestParam@Valid versions:@Valid Map< @模式(regexp=“a | b | c”) 字符串,字符串> ):字符串{ // … } } 我希望请求foo?d=any抛出一个ConstraintViolationException,但控制器是正常调用的 我的上下文中有一
@RestController
@验证
类MyController{
@GetMapping(“foo”)
有趣的固件版本差异(
@RequestParam@Valid versions:@Valid Map<
@模式(regexp=“a | b | c”)
字符串,字符串>
):字符串{
// …
}
}
我希望请求foo?d=any
抛出一个ConstraintViolationException
,但控制器是正常调用的
我的上下文中有一个MethodValidationPostProcessor
,它可以用于其他验证。如果我将RequestParam更改为installedfirmwarevervision:String@RequestParam@Valid@Length(min=3),它将正常工作
我遗漏了什么?也许我的答案不是对您正在寻找的答案的更正,但它肯定会检查您试图在控制器中执行的验证
import in.silentsudo.validators.annotations.RequestMap;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Map;
public class MapParamValidator implements ConstraintValidator<RequestMap, Map<String, String>> {
@Override
public boolean isValid(Map<String, String> stringStringMap, ConstraintValidatorContext constraintValidatorContext) {
return stringStringMap.containsKey("a") || stringStringMap.containsKey("c") || stringStringMap.containsKey("b");
}
}
如果一切顺利,你应该得到这样的东西
There was an unexpected error (type=Internal Server Error, status=500).
getFirmwareVersionDifference.versions: Invalid Request Map
javax.validation.ConstraintViolationException: getFirmwareVersionDifference.versions: Invalid Request Map
...
也许我的答案不是对您正在寻找的答案的更正,但它肯定会检查您试图在控制器中执行的验证
import in.silentsudo.validators.annotations.RequestMap;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Map;
public class MapParamValidator implements ConstraintValidator<RequestMap, Map<String, String>> {
@Override
public boolean isValid(Map<String, String> stringStringMap, ConstraintValidatorContext constraintValidatorContext) {
return stringStringMap.containsKey("a") || stringStringMap.containsKey("c") || stringStringMap.containsKey("b");
}
}
如果一切顺利,你应该得到这样的东西
There was an unexpected error (type=Internal Server Error, status=500).
getFirmwareVersionDifference.versions: Invalid Request Map
javax.validation.ConstraintViolationException: getFirmwareVersionDifference.versions: Invalid Request Map
...
这是kotlin编译器的错误/缺失功能:
如本文所述,kotlin 1.3.70部分解决了这一问题
下面是如何在build.gradle.kts
tasks.withType{
科特洛普斯酒店{
freeCompilerArgs=listOf(“-Xemit jvm类型注释”)
jvmTarget=“11”//至少8个应该可以工作,我只测试了11个
}
}
这是kotlin编译器的错误/缺少的功能:
如本文所述,kotlin 1.3.70部分解决了这一问题
下面是如何在build.gradle.kts
tasks.withType{
科特洛普斯酒店{
freeCompilerArgs=listOf(“-Xemit jvm类型注释”)
jvmTarget=“11”//至少8个应该可以工作,我只测试了11个
}
}
谢谢您的回答!半天之后,我才发现问题:这是kotlin编译器的一个bug/缺少的特性普通的java太棒了!也会是我的选择;)谢谢你的回答!半天之后,我才发现问题:这是kotlin编译器的一个bug/缺少的特性普通的java太棒了!也会是我的选择;)对我来说仍然不起作用,至少在测试中代码仍然没有验证。Kotlin版本是1.4.21。仅适用于@field:…请看,对我来说仍然不起作用,至少在测试中,代码仍然无法验证。Kotlin版本是1.4.21。仅适用于@field:…请参见
There was an unexpected error (type=Internal Server Error, status=500).
getFirmwareVersionDifference.versions: Invalid Request Map
javax.validation.ConstraintViolationException: getFirmwareVersionDifference.versions: Invalid Request Map
...