1. package org.zkdg.utils.spring.annotations.impl;
  2.  
  3. import java.lang.annotation.Annotation;
  4. import java.lang.reflect.Field;
  5. import java.sql.SQLException;
  6.  
  7. import org.aspectj.lang.JoinPoint;
  8. import org.aspectj.lang.ProceedingJoinPoint;
  9. import org.aspectj.lang.annotation.AfterThrowing;
  10. import org.aspectj.lang.annotation.Around;
  11. import org.aspectj.lang.annotation.Aspect;
  12. import org.aspectj.lang.annotation.Pointcut;
  13. import org.aspectj.lang.reflect.MethodSignature;
  14. import org.springframework.stereotype.Component;
  15. import org.zkdg.utils.entity.AjaxEntity;
  16. import org.zkdg.utils.spring.annotations.NNull;
  17.  
  18. @Aspect
  19. @Component
  20. /**
  21. *
  22. * @author 王海明
  23. * @createData 2017年7月13日 上午8:36:23
  24. * @说明 :出了一些空值。。。
  25. */
  26. public class AjaxEntityHandler {
  27.  
  28. // @Pointcut("@annotation(org.zkdg.utils.annotations.AfterHandler)")
  29.  
  30. @Pointcut("@annotation(org.zkdg.utils.spring.annotations.NullValidate)")
  31. // @Pointcut("execution(* org.dcexam.*.service.*.*(..))")
  32. public void beforeCall() {
  33. // service方法调用之前,检测参数,仅限第一个参数, 不能为空值
  34. }
  35.  
  36. /**
  37. * service发生异常时调用
  38. */
  39. @Pointcut("execution(* org.dcexam.*.service.*.*(..))")
  40. public void afterThrowEx() {
  41. System.out.println("************\n\n\n\n\n\n\n\n\n\n\n\n*******");
  42. }
  43.  
  44. @Around(value = "beforeCall()")
  45. public AjaxEntity doBefore(ProceedingJoinPoint point) throws Throwable {
  46. // TODO Auto-generated method stub
  47. // 判断不能为空
  48. Object[] args = point.getArgs();
  49. if (args == null || args[0] == null) {
  50. return new AjaxEntity("warning", "未选择任何数据。。。");
  51. }
  52.  
  53. // 获取代理对象类方法参数
  54. MethodSignature target = (MethodSignature) point.getSignature();
  55.  
  56. Annotation[][] annotations = target.getMethod().getParameterAnnotations();
  57.  
  58. int argsIndex = 0;
  59. StringBuilder sb = new StringBuilder();
  60. for (Annotation[] annotation : annotations) {
  61. NNull nn = (NNull) annotation[0];
  62. String[] descs = nn.desc();
  63. String[] fields = nn.field();
  64. if (fields.length > 0 && fields.length > 0 && descs.length == fields.length) {
  65. for (int i = 0; i < fields.length; i++) {
  66. Field field = args[argsIndex].getClass().getDeclaredField(fields[i]);
  67. // 允许访问
  68. field.setAccessible(true);
  69. Object object = field.get(args[argsIndex]);
  70. if (object == null) {
  71. sb.append(descs[i]).append("不能为空。。。<br>");
  72. }
  73. if (object instanceof String) {
  74. String string = (String) object;
  75. if (string.trim().length() == 0)
  76. sb.append(descs[i]).append("不能为空。。。<br>");
  77. else if (string.trim().equals("0"))
  78. sb.append("未选择" + descs[i] + "。。。<br>");
  79. } else if (object instanceof Number) {
  80. Integer integer = (Integer) object;
  81. if (integer == 0)
  82. sb.append("未选择" + descs[i] + "。。。<br>");
  83. }
  84.  
  85. }
  86. if (sb.length() > 0)
  87. return AjaxEntity.ERROR(sb.toString());
  88. }
  89. argsIndex++;
  90. }
  91.  
  92. // 加上@Nullvalidate 注解,不允许出现空 值
  93. for (Object obj : args) {
  94. if (obj == null) {
  95. return AjaxEntity.WARNING("出现了不允许的空值");
  96. } else if (obj instanceof String) {
  97. if (((String) obj).length() == 0) {
  98. return AjaxEntity.WARNING("出现了不允许的空值");
  99. }
  100. }
  101. }
  102. AjaxEntity ajax = (AjaxEntity) point.proceed(args);
  103.  
  104. return ajax == null ? AjaxEntity.ERROR("操作失败") : ajax;
  105. }
  106.  
  107. /**
  108. *
  109. * @param joinPoint
  110. * 连接点
  111. * @param ex
  112. * 异常
  113. * @return AjaxEntity 异常信息
  114. */
  115. @AfterThrowing(value = "afterThrowEx()", throwing = "ex")
  116. public void doAfterThrowEx(JoinPoint joinPoint, Exception ex) {
  117. AjaxEntity ajax = new AjaxEntity();
  118.  
  119. if (ex.getCause() instanceof SQLException) {
  120. // 数据库操作异常
  121. ajax = AjaxEntity.ERROR("操作数据库时出现异常");
  122. }
  123.  
  124. }
  125.  
  126. }

另外,java 命名 时 。属性最好不要有 下划线 , 否则 可能会粗错。。。。。

java 反射 处理 空值的更多相关文章

  1. java 反射赋空值

    https://stackoverflow.com/questions/10087989/how-do-i-reflectively-invoke-a-method-with-null-as-argu ...

  2. Java进阶(六)Java反射机制可恶问题NoSuchFieldException

    作为一种重要特性,Java反射机制在很多地方会用到.在此做一小结,供朋友们参考. 首先从一个问题开始着手. 可恶的问题又来了,NoSuchFieldException,如下图所示: 完全不知道这个qu ...

  3. 面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用

    原文链接:原文来自公众号:C you again,欢迎关注! 1.问题描述     "如何在Integer类型的ArrayList中同时添加String.Character.Boolean等 ...

  4. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  5. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  6. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  7. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  8. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  9. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

随机推荐

  1. leetcode637

    层次遍历,计算每一层的节点值,然后求平均值. class Solution { public: vector<double> averageOfLevels(TreeNode* root) ...

  2. docker 笔记(3)第一个dockerfile

    #vim Dockerfile FROM ubuntu RUN apt-get update && apt-get install -y vim #docker build -t ub ...

  3. session详解&和cookie的区别

    session简介 1. 定义 session用来保存会话数据, 将数据保存到服务器中. 2. 作用 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),一个浏览器独占一 ...

  4. Spring 框架学习 有用

    1.1.1 spring的优势 方便解耦,简化开发 通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合.用户也不必再为单例模式类.属性文件 ...

  5. ROS Learning-027 (提高篇-005 A Mobile Base-03) 控制移动平台 --- Twist 消息

    ROS 提高篇 之 A Mobile Base-03 - 控制移动平台 - Twist 消息 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14 ...

  6. c# 调用系统默认图片浏览器打开图片

    private void OpenImage(string fileName) { try { Process.Start(fileName); } catch (Exception ex) { // ...

  7. 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-002插入排序法(Insertion sort)

    一.介绍 1.时间和空间复杂度 运行过程 2.特点: (1)对于已排序或接近排好的数据,速度很快 (2)对于部分排好序的输入,速度快 二.代码 package algorithms.elementar ...

  8. Java-马士兵设计模式学习笔记-策略模式-模拟 Comparator接口

    续上一篇  <Java 模拟 Comparable接口> 一.Teacher类及Student类的比较大小方式是不固定的,比如老师除了比较职称外,还可比较工龄大小,年龄大小等.则定义Com ...

  9. Posters TopCoder - 1684

    传送门 分析 首先我们不难想到1e4^5的暴力枚举,但显然这是不行的,于是我们考虑对于每一张海报肯定有一种最优情况使得它至少有一条边要么靠着板子的边要么靠着之前的某一张海报的边,这样我们便可以将复杂度 ...

  10. Django 链接数据库错误 Strick Mode 解决

    报错信息: WARNINGS:?: (mysql.W002) MySQL Strict Mode is not set for database connection ‘default‘HINT: M ...