@PathVariable的自定义验证



控制器接受代码作为路径变量

@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中验证和预授权检查的典型顺序如下,可能不太直观:

  1. @RequestBody参数验证
  2. @PreAuthorize检查
  3. @PathVariable参数验证

所以我认为路径变量验证与请求体验证相比不起作用-但它只是由授权检查覆盖;-)

相关内容

  • 没有找到相关文章

最新更新