首页 > 解决方案 > Spring方法级验证器

问题描述

我想验证两个论点是否getCategories()满足我的期望。我创建了一个验证器:

@Constraint(validatedBy = EnvironmentIdValidator.class)
@Target({METHOD, CONSTRUCTOR})
@Retention(RUNTIME)
@Documented
public @interface IEnvironmentIdValidator {
    String message() default "Invalid environment ID.";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    String[] value();
}

和实施:

@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public class EnvironmentIdValidator implements ConstraintValidator<IEnvironmentIdValidator,Object[]> {

    @Override
    public void initialize(IEnvironmentIdValidator constraintAnnotation) {
        // logic

    }

    @Override
    public boolean isValid(Object[] object, ConstraintValidatorContext constraintValidatorContext) {
       // logic
    }
}

我在带有注释的端点之一调用此验证器,同时传递两个参数。

    @IEnvironmentIdValidator(value = {"environmentID", "requestAuthorizationHeader"})
    public ResponseEntity<?> getCategories(@PathVariable(name = "environmentID") Long environmentID,
                                           @RequestHeader("Authorization") String requestAuthorizationHeader) {
//...
}

但不幸的是,验证器没有被触发。我可能做错了什么?

标签: javaspringvalidationspring-boot

解决方案


您的控制器必须使用@Validated 进行注释,否则您的 bean 将不会附加自定义验证。

//...
import org.springframework.validation.annotation.Validated;

@Controller
@Validated
public class MyController {

    @IEnvironmentIdValidator
    @GetMapping("/test/{environmentID}")
    public ResponseEntity<?> getCategories(@PathVariable(name = "environmentID") Long environmentID,
                                      @RequestHeader("Authorization") String requestAuthorizationHeader) {
    //...

推荐阅读