Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用一个';是在javax.validation.constraints.Max中的application.yml中定义的吗?_Java_Spring_Annotations_Autowired_Javax.validation - Fatal编程技术网

我可以使用一个';是在javax.validation.constraints.Max中的application.yml中定义的吗?

我可以使用一个';是在javax.validation.constraints.Max中的application.yml中定义的吗?,java,spring,annotations,autowired,javax.validation,Java,Spring,Annotations,Autowired,Javax.validation,这是一个相当合适的问题,但希望有人知道答案: 我有一个带有GetMapping的SpringFramework RestController,它使用javax.validation注释进行一些参数验证。我想使用application.yml中定义的属性作为url参数的最大值,但我得到的编译器错误是变量应该是常量。 见代码: @RestController @Validated public class AssetController { private final int maxW

这是一个相当合适的问题,但希望有人知道答案:

我有一个带有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) {
... 
}
在@Max(value=maxWaitMillis)处,它表示maxWaitMillis应该是常量,因为我猜在构造函数从application.yml获取值之前,注释中的检查已经完成

如果我在构造函数或方法体中检查
maxWaitMillis
的值,它的值确实是5000

有人知道是否有办法在验证注释中使用application.yml的值吗


谢谢!

注释
值必须是编译时常量,因此没有简单的方法来执行您尝试执行的操作

这是一种,一种,

private final int maxWaitMillis=5000;
这不是:

private final int maxWaitMillis;
@自动连线
公共资产控制器(@Value(${maxWaitMillis})int-maxWaitMillis){
this.maxWaitMillis=maxWaitMillis;
}

创建自定义验证器,如下所示

@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;
    }
}
@Target({ElementType.PARAMETER})
@保留(运行时)
@约束(validatedBy=MaxWaitMillisValidator.class)
@记录
公共@接口MaxWaitMillis{
字符串消息()默认为“无效的最大等待”;
类[]组()默认值{};

类该表达式不是那样工作的。它只看到一个字符串,它期望一个int。我认为它可以用于字符串值,
int
部分是错误的。例如:
@GetMapping
value。你能说明你的意思吗?我认为不可能使用“${}符号”对于编译时常量,所以我正在寻找另一种方法。我认为application.yml中的变量是int还是StringI并不重要,我认为是int还是StringI,但是
@GetMapping(value=“${property name}”)
有效。嗯,我猜它在voor javax.validation中不起作用。@Max(value=“${maxWaitMillis}”)给出错误
不兼容类型:java.lang.String无法转换为long
@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;
    }
}