简单概括定义注解的步骤以及作用:
一:明确注解的使用空间(类 方法 等)
二:明确注解的作用
三:开始编写注解定义
四:编写注解切面类
下面附上代码:
一:注解定义如下:
因为我们要做一个非空校验参数,那么使用注解就必须把 非空的字段传入进去。
这些非空的字段是属于哪一个类的呢?那么久需要定义一个对象所属类。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequestRequire {
/**
* 请求当前接口所需要的参数,多个以小写的逗号隔开
* @return
*/
public String require() default "";
/**
*传递参数的对象类型
*/
public Class<?> parameter() default Object.class;
}
二:切面类代码如下:
分析代码:
@Aspect 表明这个类是切面类
@Component 这个类交由Spring管理
@Pointcut("@annotation(com.bonc.ioc.iot.annotation.RequestRequire)")
表明这个切面类是为哪一个注解服务的
around
切面类的核心方法。
@Aspect
@Component
public class RequestRequireAspect {
protected Logger log=Logger.getLogger(RequestRequireAspect.class);
public RequestRequireAspect() {
// log.info("初始化接口参数非空判断切面类...");
}
@Pointcut("@annotation(com.bonc.ioc.iot.annotation.RequestRequire)")
public void controllerInteceptor() {
}
@Around("controllerInteceptor()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
//获取注解的方法参数列表
Object[] args = pjp.getArgs();
//获取被注解的方法
MethodInvocationProceedingJoinPoint mjp = (MethodInvocationProceedingJoinPoint) pjp;
MethodSignature signature = (MethodSignature) mjp.getSignature();
Method method = signature.getMethod();
//获取方法上的注解
RequestRequire require = method.getAnnotation(RequestRequire.class);
//以防万一,将中文的逗号替换成英文的逗号
String fieldNames=require.require().replace(",", ",");
//从参数列表中获取参数对象
Object parameter=null;
for(Object pa:args){
//class相等表示是同一个对象
if (pa.getClass()==require.parameter() ) {
parameter=pa;
}
}
//通过反射去和指定的属性值判断是否非空
Class cl=parameter.getClass();
for(String fieldName:fieldNames.split(",")){
//根据属性名获取属性对象
// Field f=cl.getDeclaredField(fieldName);
Field f=ReflectUtil.getDeclaredFields(parameter,fieldName);
//设置可读写权限
f.setAccessible(true);
//获取参数值,因为我的参数都是String型所以直接强转
Object value=f.get(parameter);
//非空判断
if(value==null||!StringUtil.isNotNull(value.toString())){
log.error("参数:"+fieldName+"不允许为空");
//将异常写会页面
AppReply appReply=AppReply.error("参数:"+fieldName+"不允许为空", ExceptionCodeUtil.IOCE_AS002);
ConvertObject2Json.writeJson(appReply,HttpServletUtil.getHttpServletRequest(),HttpServletUtil.getHttpServletResponse());
throw new IllegalArgumentException("参数"+fieldName+"不允许为空");
}
}
//如果没有报错,放行
return pjp.proceed();
}
}
三:
COntroller 使用方法:
@RequestMapping(value = "getIotParserServiceById")
@ResponseBody
@RequestRequire(require="serviceId",parameter=IotParserService.class)
public AppReply<IotParserService> getIotParserServiceById(IotParserService iotParserService) {
AppReply<IotParserService> data=new AppReply<IotParserService>();
try{
iotParserService=iotParserServiceService.getIotParserServiceById(iotParserService.getServiceId());
data=AppReply.success(iotParserService);
}catch(Exception e){
data=AppReply.error("根据服务Id找不到记录", ExceptionCodeUtil.IOCE_AS002);
logger.error(e.getStackTrace());
}
return data;
}