<!-- spring-boot aop依赖配置引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
自定义注解
package com.example.demo.common.validation;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import java.lang.annotation.*;
//作用于方法上
@Target(ElementType.METHOD)
//运行期保留
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
@Scope("prototype")
/**
* @author vic
*/
public @interface Validate {
Class<?> value();
}
自定义抽象类
package com.example.demo.common.validation;
/**
* @author vic
*/
public abstract class Validator {
public abstract Object validate(Object... t);
}
利用注解抓取到注解上的class
package com.example.demo.common.validation;
import com.example.demo.common.enumset.EnumSet;
import com.example.demo.common.exception.MyException;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author vic
*/
@Component
@Aspect
public class FormValidation {
private static final String METHODNAME = "validate";
//注解式表单验证
@Around("@annotation(com.example.demo.common.validation.Validate)")
@Order(1)
public Object formValidation(ProceedingJoinPoint point) throws Throwable {
Signature signature = point.getSignature();//方法签名
Method method = ((MethodSignature) signature).getMethod();
//这个方法才是目标对象上有注解的方法
Method realMethod = point.getTarget().getClass().getDeclaredMethod(signature.getName(), method.getParameterTypes());
//获取到方法上的自己已知的注解
Validate annotation = realMethod.getAnnotation(Validate.class);
//获取到注解上的值
String name = annotation.value().getName();
//通过反射调用注解中的方法
Class<?> clazz = Class.forName(name);
Method clazzMethod = clazz.getMethod(METHODNAME, Object[].class);
Object invoke = null;
try {
//获取到抽象类具体的继承
Object o = clazz.newInstance();
//提交的参数
Object[] args = point.getArgs();
invoke = clazzMethod.invoke(o, args);
} catch (InvocationTargetException e) {
throw e.getTargetException();
} catch (Exception e) {
throw new MyException(EnumSet.FAILURE);
}
if (null != invoke) {
return invoke;
}
return point.proceed();
}
}
继承抽象类 实现抽象方法
实现自己的数据校验
package com.example.demo.system.validate;
import com.example.demo.common.enumset.EnumSet;
import com.example.demo.common.exception.MyException;
import com.example.demo.common.utils.SpringContextUtils;
import com.example.demo.common.validation.Validator;
import com.example.demo.system.dao.SysUserMapper;
import com.example.demo.system.entity.SysUser;
import com.example.demo.system.entity.SysUserExample;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class SysUserAdd extends Validator {
@Override
public Object validate(Object... t) {
SysUser sysUser = (SysUser) t[0];
SysUserMapper sysUserMapper = SpringContextUtils.getBean("sysUserMapper",SysUserMapper.class);
SysUserExample example=new SysUserExample();
SysUserExample.Criteria criteria = example.createCriteria();
String name = sysUser.getName();
criteria.andNameEqualTo(name);
List<SysUser> sysUsers = sysUserMapper.selectByExample(example);
if(sysUsers.size()>0){
throw new MyException(EnumSet.FAILURE.getCode(),"用户名存在!");
}
return null;
}
}
在service 层使用
@Validate(SysUserAdd.class)
@Override
public void save(SysUser sysUser) {
String createuser = redisUserUtil.getUser().getId();
String id = UUIDUtils.randomUUID();
sysUser.setId(id);
sysUser.setCreateuser(createuser);
sysUser.setCreatedate(new Date());
sysUserMapper.insertSelective(sysUser);
}