SpringBoot接口参数校验N种实用技巧大揭秘( 三 )

SpringBoot接口参数校验N种实用技巧大揭秘
文章插图
图片
参数中我们吧 address 字段设置上后 参数进行校验了 。接下来修改 Users 实体,吧 Address 默认 new 出来再进行测试
@Validprivate Address address = new Address();

SpringBoot接口参数校验N种实用技巧大揭秘

文章插图
图片
发现即便我们的入参没有 address 字段也能进行校验了,这里大家需要注意下 。
  • 自定义参数校验
请查看【技巧】API接口参数验证的必备神器,让你的代码更高效!
  • 国际化支持
public class Users {@NotEmpty(message = "{name.notempty}", groups = G1.class)private String name ;@Min(value = https://www.isolves.com/it/cxkf/kj/2023-11-08/10, message = "年龄不能小于 10", groups = G1.class)@Min(value = 20, message = "年龄不能小于 20", groups = G2.class)private Integer age ;@Length(min = 6, max = 18, message = "邮箱介于 6 到 18 之间", groups = {G1.class,G2.class})private String email ;@NotEmpty(message = "电话必需填写")private String phone ;@Validprivate Address address = new Address();}注意这里的 name 字段中的 message 属性我们使用了表达式的方式,而 name.notempty 为我们在资源文件中定义的 key 。接下来,在 resources/下新建如下属性文件:
SpringBoot接口参数校验N种实用技巧大揭秘

文章插图
图片
属性文件必须是 ValidationMessages 开头 。默认文件及 zh_CN 内容:
name.notempty=姓名必需填写en_US 内容:
name.notempty=name is require测试:
SpringBoot接口参数校验N种实用技巧大揭秘

文章插图
图片
为了模拟英文环境,我们需要设置请求头 Accept-Language:en-US
SpringBoot接口参数校验N种实用技巧大揭秘

文章插图
图片
显示了 en_US.properties 中定义的消息,到此国际化完成 。
  • AOP 验证参数统一处理
自定义注解标记需要进行统一参数校验处理的接口 。
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface EnableValidate {}AOP切面类
@Component@Aspectpublic class ValidateAspect {@Pointcut("@annotation(com.pack.params.valid.EnableValidate)")public void valid() {}@Before("valid()")public void validateBefore(JoinPoint jp) {Object[] args = jp.getArgs() ;for (Object arg : args) {if (arg instanceof BindingResult) {BindingResult result = (BindingResult) arg ;if (result.hasErrors()) {String messages = result.getAllErrors().stream().map(err -> err.getDefaultMessage()).collect(Collectors.joining(",")) ;throw new ParamsException(messages) ;}}}}}定义了一个前置通知 , 拦截标记有@EnableValidate 注解的接口 。如果有异常信息收集错误信息然后抛出异常信息 。测试:
@PackMapping(value = https://www.isolves.com/it/cxkf/kj/2023-11-08/"/valid/save1", method = RequestMethod.POST)@EnableValidatepublic Object save1(@RequestBody @Validated(Users.G1.class) Users user, BindingResult result) {Optional> op = valid(result) ;if (op.isPresent()) {return op.get() ;}return "success" ;}
SpringBoot接口参数校验N种实用技巧大揭秘

文章插图
图片
到此我们通过 AOP 技术实现了参数统一处理,但是这样输出错误信息很不友好 , 接下来我们来完善下,通过全局异常通知拦截处理 。这里的异常信息我们可以通过全局异常处理下格式 。
完毕?。。?

【SpringBoot接口参数校验N种实用技巧大揭秘】


推荐阅读