我可以使用javax.validation.constraints.max中application.yml中定义的自动连接变量吗?

aelbi1ox  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(342)

这是一个非常合适的问题,但希望有人知道答案:
我有一个带有getmapping的springframeworkrestcontroller,它有一些使用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) {
... 
}

应用程序.yml:

maxWaitMillis: 5000

在@max(value=maxwaitmillis)处,它说maxwaitmillis应该是常量,因为我猜在构造函数从application.yml获取值之前,注解中的检查已经完成。
如果我检查 maxWaitMillis 在构造函数或方法体中,它的值为5000。
有人知道是否有方法在验证注解中使用application.yml的值吗?
谢谢!

pbwdgjma

pbwdgjma1#

这个 value 对于一个 annotation 必须是编译时常量,因此没有简单的方法来执行您要执行的操作。
这是一个常量变量,一种常量表达式:

private final int maxWaitMillis = 5000;

这不是:

private final int maxWaitMillis;

@Autowired
public AssetController(@Value("${maxWaitMillis}") int maxWaitMillis) {
    this.maxWaitMillis = maxWaitMillis;
}

相关问题