控制器接受代码作为路径变量
@RestController
@RequestMapping(value = "/api/currency")
@Validated
public class CurrencyController {
@GetMapping("/gif/{code}")
public ResponseEntity<Map> getChangeGif(@PathVariable @Code String code){
// some implementation
return null;
}
}
我想使用我自己的注释来验证我想要的代码
@Target( { FIELD, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = CodeValidator.class)
public @interface Code {
public String message() default "error message";
public Class<?>[] groups() default {};
public Class<? extends Payload>[] payload() default {};
}
这是验证器
public class CodeValidator implements ConstraintValidator<Code, String> {
@Override
public void initialize(Code constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
}
@Override
public boolean isValid(String code, ConstraintValidatorContext context) {
// validator implementation
return false;
}
}
由于某些原因,当请求来临时,验证只是跳过,控制器继续工作
只是一个大胆的猜测,因为你特别要求@PathVariable
验证,我只是偶然发现了这个自己:
如果您在一个实际的项目中,您可能还需要一个阻止验证的授权检查。spring中验证和预授权检查的典型顺序如下,可能不太直观:
@RequestBody
参数验证@PreAuthorize
检查@PathVariable
参数验证
所以我认为路径变量验证与请求体验证相比不起作用-但它只是由授权检查覆盖;-)