欢迎关注博主公众号:【纯洁的明依】文章由陈晓阳原创。 本人微信:chenxiaoyangzxy. 免费提供本人大量学习资料。
简单概括定义注解的步骤以及作用:
一:明确注解的使用空间(类 方法 等)
二:明确注解的作用
三:开始编写注解定义
四:编写注解切面类
下面附上代码:
一:注解定义如下:
因为我们要做一个非空校验参数,那么使用注解就必须把 非空的字段传入进去。
这些非空的字段是属于哪一个类的呢?那么久需要定义一个对象所属类。
@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@Componentpublic 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;}