package org.zkdg.utils.spring.annotations.impl; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.sql.SQLException; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import org.zkdg.utils.entity.AjaxEntity; import org.zkdg.utils.spring.annotations.NNull; @Aspect @Component /** * * @author 王海明 * @createData 2017年7月13日 上午8:36:23 * @说明 :出了一些空值。。。 */ public class AjaxEntityHandler { // @Pointcut("@annotation(org.zkdg.utils.annotations.AfterHandler)") @Pointcut("@annotation(org.zkdg.utils.spring.annotations.NullValidate)") // @Pointcut("execution(* org.dcexam.*.service.*.*(..))") public void beforeCall() { // service方法调用之前,检测参数,仅限第一个参数, 不能为空值 } /** * service发生异常时调用 */ @Pointcut("execution(* org.dcexam.*.service.*.*(..))") public void afterThrowEx() { System.out.println("************ *******"); } @Around(value = "beforeCall()") public AjaxEntity doBefore(ProceedingJoinPoint point) throws Throwable { // TODO Auto-generated method stub // 判断不能为空 Object[] args = point.getArgs(); if (args == null || args[0] == null) { return new AjaxEntity("warning", "未选择任何数据。。。"); } // 获取代理对象类方法参数 MethodSignature target = (MethodSignature) point.getSignature(); Annotation[][] annotations = target.getMethod().getParameterAnnotations(); int argsIndex = 0; StringBuilder sb = new StringBuilder(); for (Annotation[] annotation : annotations) { NNull nn = (NNull) annotation[0]; String[] descs = nn.desc(); String[] fields = nn.field(); if (fields.length > 0 && fields.length > 0 && descs.length == fields.length) { for (int i = 0; i < fields.length; i++) { Field field = args[argsIndex].getClass().getDeclaredField(fields[i]); // 允许访问 field.setAccessible(true); Object object = field.get(args[argsIndex]); if (object == null) { sb.append(descs[i]).append("不能为空。。。<br>"); } if (object instanceof String) { String string = (String) object; if (string.trim().length() == 0) sb.append(descs[i]).append("不能为空。。。<br>"); else if (string.trim().equals("0")) sb.append("未选择" + descs[i] + "。。。<br>"); } else if (object instanceof Number) { Integer integer = (Integer) object; if (integer == 0) sb.append("未选择" + descs[i] + "。。。<br>"); } } if (sb.length() > 0) return AjaxEntity.ERROR(sb.toString()); } argsIndex++; } // 加上@Nullvalidate 注解,不允许出现空 值 for (Object obj : args) { if (obj == null) { return AjaxEntity.WARNING("出现了不允许的空值"); } else if (obj instanceof String) { if (((String) obj).length() == 0) { return AjaxEntity.WARNING("出现了不允许的空值"); } } } AjaxEntity ajax = (AjaxEntity) point.proceed(args); return ajax == null ? AjaxEntity.ERROR("操作失败") : ajax; } /** * * @param joinPoint * 连接点 * @param ex * 异常 * @return AjaxEntity 异常信息 */ @AfterThrowing(value = "afterThrowEx()", throwing = "ex") public void doAfterThrowEx(JoinPoint joinPoint, Exception ex) { AjaxEntity ajax = new AjaxEntity(); if (ex.getCause() instanceof SQLException) { // 数据库操作异常 ajax = AjaxEntity.ERROR("操作数据库时出现异常"); } } }
另外,java 命名 时 。属性最好不要有 下划线 , 否则 可能会粗错。。。。。