如何解决我可以使用在 javax.validation.constraints.Max 的 application.yml 中定义的自动装配变量吗?
这是一个非常小众的问题,但希望有人知道答案:
我有一个带有 GetMapping 的 SpringFramework RestController,它有一些使用 javax.validation 注释的参数验证。我想使用 application.yml 中定义的属性作为 url 参数的最大值,但我收到编译器错误,该变量应该是常量。 见代码:
@RestController
@Validated
public class AssetController {
private final int maxWaitMillis;
@Autowired
public AssetController(@Value("${maxWaitMillis}") int maxWaitMillis) {
this.maxWaitMillis = maxWaitMillis;
}
@GetMapping(value = "/asset",produces = MediaType.IMAGE_JPEG_VALUE)
@ResponseBody
public ResponseEntity<byte[]> getAsset(@RequestParam
@NotBlank(message = "id should not be empty") String id,@RequestParam(defaultValue = "100",name = "timeout-ms")
@Min(value = 0,message = "minimum timeout is 0 ms")
@Max(value = maxWaitMillis,message = "max timeout is " +
maxWaitMillis) int timeoutMs) {
...
}
application.yml:
maxWaitMillis: 5000
在@Max(value = maxWaitMillis 它说 maxWaitMillis 应该是常量,因为我猜注释中的检查是在构造函数可以从 application.yml 获取值之前完成的。
如果我在构造函数或方法体中检查 maxWaitMillis
的值,它的值为 5000。
有谁知道是否有办法在验证注释中使用 application.yml 中的值?
谢谢!
解决方法
按如下方式创建自定义验证器
@Target({ElementType.PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = MaxWaitMillisValidator.class)
@Documented
public @interface MaxWaitMillis {
String message() default "Invalid max wait";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class MaxWaitMillisValidator implements ConstraintValidator<MaxWaitMillis,Integer> {
@Value("${maxWaitMillis}")
private int maxWaitMillis;
@Override
public boolean isValid(Integer value,ConstraintValidatorContext context) {
return value <= maxWaitMillis;
}
}
然后您可以在控制器中使用@MaxWaitMillis 代替@Max。
,value
的 annotation
必须是编译时间常量,因此没有简单的方法可以完成您想要做的事情。
这是一个 constant variable,一种 constant expression:
private final int maxWaitMillis = 5000;
这不是:
private final int maxWaitMillis;
@Autowired
public AssetController(@Value("${maxWaitMillis}") int maxWaitMillis) {
this.maxWaitMillis = maxWaitMillis;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。