java实现表单必填参数验证的方法
作者:任未然 发布时间:2023-06-16 21:41:24
标签:java,表单,验证
一. 概述
在开发后端接口, 通常都会涉及检验参数必填校验, 一般我们的处理都是很粗暴的写个if()判断, 然后抛异常. 本文将介绍通过代理的思想, 用注解优雅的处理非空判断
二. 实现过程
最终想要的效果->在方法的参数加个注解或者参数的属性里加个注解, 注解可以自定义报错信息, 就可以实现自动非空校验
2.1 编写注解
@Target({ElementType.FIELD}) //作用的位置
@Retention(RetentionPolicy.RUNTIME) //作用域
@Documented
public @interface NotNull {
String value() default "{报错信息}";
}
说明: 该注解用来绑定某个必填属性
@Target({ElementType.TYPE,ElementType.METHOD}) //作用的位置
@Retention(RetentionPolicy.RUNTIME) //作用域
@Documented
public @interface CheckParam {
}
说明: 该注解用来绑定某个类或某个方法,作为校验代理拦截的标识
2.2 编写校验代理AOP
@Aspect
@Slf4j
public class CheckParamAop {
@Around("@within(com.midea.cloud.common.annotation.CheckParam) || @annotation(com.midea.cloud.common.annotation.CheckParam)")
public Object cacheClear(ProceedingJoinPoint pjp) throws Throwable {
try {
MethodSignature signature = (MethodSignature) pjp.getSignature();
// 方法参数注解类型
Annotation[][] parameterAnnotations = signature.getMethod().getParameterAnnotations();
// 方法参数的类型
Class<?>[] parameterTypes = signature.getMethod().getParameterTypes();
// 获取方法参数
Object[] args = pjp.getArgs();
if(!ObjectUtils.isEmpty(args)){
// 遍历参数
AtomicInteger index = new AtomicInteger(0);
Arrays.stream(args).forEach(o -> {
int indexNo = index.getAndAdd(1);
/**
* 检查方法参数非空
*/
Annotation[] parameterAnnotation = parameterAnnotations[indexNo];
if(!ObjectUtils.isEmpty(parameterAnnotation)){
Arrays.stream(parameterAnnotation).forEach(annotation -> {
if(annotation instanceof NotNull){
NotNull notNull = (NotNull)annotation;
// 注解信息
String message = notNull.value();
// 通过工具类获取多语言信息
String localeMsg = LocaleHandler.getLocaleMsg(message);
// 检查参数非空
Optional.ofNullable(o).
filter(o1 -> !ObjectUtils.isEmpty(o1)).
orElseThrow(()->new BaseException(localeMsg));
}
});
}
/**
* 检查方法参数属性非空
*/
Class<?> parameterType = parameterTypes[indexNo];
Field[] fields = parameterType.getDeclaredFields();
if(!ObjectUtils.isEmpty(fields)){
// 遍历属性
Arrays.stream(fields).forEach(field -> {
NotNull annotation = field.getAnnotation(NotNull.class);
if(null != annotation){
Object value = null;
// 注解信息
String message = annotation.value();
// 通过工具类获取多语言信息
String localeMsg = LocaleHandler.getLocaleMsg(message);
Optional.ofNullable(o).orElseThrow(()->new BaseException(localeMsg));
try {
field.setAccessible(true);
value = field.get(o);
} catch (Exception e) {
log.error("获取属性值报错"+e.getMessage());
log.error("获取属性值报错"+e);
}
// value为空时报错
Optional.ofNullable(value).
filter(o1 -> !ObjectUtils.isEmpty(o1)).
orElseThrow(()->new BaseException(localeMsg));
}
});
}
});
}
} catch (BaseException e) {
throw e;
} catch (Exception e){
log.error("检查参数aop报错:"+e.getMessage());
log.error("检查参数aop报错:"+e);
}
return pjp.proceed();
}
}
三. 使用示例
public class Test{
@Data
class Demo{
@NotNull("名字不能为空!")
private String name;
private String sex;
private Integer age;
}
@CheckParam
public void testNoNullCheck1(Demo demo) {
}
@CheckParam
public void testNoNullCheck2(@NotNull("user不能为空") User user) {
}
}
来源:https://www.jianshu.com/p/f2578aef5925
0
投稿
猜你喜欢
- 最近用到一些字符串加密,而.net中提供的加密算法中用起来比较复杂,便简单的封装了一下,方便日后使用。public class Encryp
- 闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过。它
- 首先添加一个timer,50susing System;using System.Collections.Generic;using Sys
- 本文为大家分享了java多线程的简单实现及线程池实例,供大家参考,具体内容如下一、多线程的两种实现方式1、继承Thread类的多线程/**
- 方法参数public String listFireEvent(@Valid FireSearch fireSearch, Ht
- 本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制
- (由于篇幅原因阐述的不够详细科学,不喜勿喷)。经常看到java中对byte数组的不同定义,粗略整理的一下:一个字节(byte)=8位(bit
- 说明:此头像类似微信群组头像,整个头像由组内前N位人员的头像组合而成,可用网络或本地图片进行组合,最终显示为一个头像整体,看效果图:一、自定
- 安装方式:1):通过ppa(源) 方式安装.2):通过官网安装包安装.JDK官网下载地址一:使用ppa(源)方式安装:1):添加ppa源su
- 在Excel中如果能够将具有多级明细的数据进行分组显示,可以清晰地展示数据表格的整体结构,使整个文档具有一定层次感。根据需要设置显示或者隐藏
- Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Co
- springboot集成开发实现商场秒杀加入主要依赖<dependency> <groupId>org.spring
- Scrollview标题栏滑动渐变仿京东样式(上滑显示下滑渐变消失)/** * @ClassName MyScrollView * @Aut
- 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listselector,有一个默认的颜色,同理
- 使用第三方的vitamio插件实现简易的播放器。vitamio版本(5.2.3)官网地址:官网地址效果展示效果项目结构代码:MainActi
- 本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下话不多说先上效果前言写这个音乐播放器实在是迫不得已。因为我们
- 在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。通常对象之间的比较可以从两个方面去看:第一个方面:对象的地址是否
- 现在就为大家介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1、公钥加密,私钥解密;2、私钥加密,公钥解密。下面就为大家分析一
- 在有些产品的研发过程中,一般我们都有很多条数据记录在一个LOG文件中。在查看最新的数据记录都是从最开始保存的那条开始存储,所以,参考了网上一
- private string CheckCidInfo(string cid) &