基于反射的自动校验工具类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaozhegaa/article/details/82951110

目录

 

基于反射的自动校验工具类

源码

代码编写

1. 搭建SpringBoot项目,参考一下的文章:

2. 编写一个简单的Hello,尝试访问:

3. 准备工作ok,编写一个用户实体

4. 编写一个Check注解,这个注解用来标识哪一个字段需要被校验的,扩展性

5. 给需要被校验的字段添加上@Check注解

6. 编写返回类BusiResult和 BusiStatus类

7. 在HelloController中,模拟post提交数据方法,在controller中调用RequestHandler的方法校验

8. 在RequestHandler利用反射检验

9.结果演示 – postman

此致,我们的自动校验就完成了。


基于反射的自动校验工具类

        分享基于反射的自动检验工具类~~开发N个接口发现,每个接口都要进行非空检验,写了一个工具类帮助自己进行滤空操作,建议在RequestHandler中检验的检验逻辑根据自己的逻辑而定。非通用。
  • 源码

https://download.csdn.net/download/xiaozhegaa/10703385

  • 代码编写

1. 搭建SpringBoot项目,参考一下的文章:

https://blog.csdn.net/xiaozhegaa/article/details/82912184
 
 
Pom.xml
<?xml version="1.0" encoding="UTF-8"?>

  <project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

  

    <groupId>com.dgut.edu.cn</groupId>

    <artifactId>AutoValidate</artifactId>

    <version>1.0-SNAPSHOT</version>

  

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>1.5.1.RELEASE</version>

        <relativePath/>

    </parent>

  

    <dependencies>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-devtools</artifactId>

            <optional>true</optional>

        </dependency>

    </dependencies>

  

    <build>

        <plugins>

            <plugin>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-maven-plugin</artifactId>

            </plugin>

        </plugins>

    </build>

  

  </project>
 
 
其他代码参考上面的文章。

2. 编写一个简单的Hello,尝试访问:

@RestController

  public class HelloController {

   @GetMapping("/hello")

   public String hello(String name){

      return "hello " + name;

   }

}

3. 准备工作ok,编写一个用户实体

package dgut.cn.domain;

  

  import dgut.cn.annotation.Check;

  

  /**

 * @ClassName:

 * @Description:

 * @Author:zhenghongbin

 * @Date: 2018/10/6 12:10

 * @Version: v1.0

 */

  public class User {

  

   private String username;

  

   private String password;

  

   private Integer level;

  

   private Boolean sex;

  

   private float money;

  

   public String getUsername() {

      return username;

   }

  

   public void setUsername(String username) {

      this.username = username;

   }

  

   public String getPassword() {

      return password;

   }

  

   public void setPassword(String password) {

      this.password = password;

   }

  

   public Integer getLevel() {

      return level;

   }

  

   public void setLevel(Integer level) {

      this.level = level;

   }

  

   public Boolean isSex() {

      return sex;

   }

  

   public void setSex(Boolean sex) {

      this.sex = sex;

   }

  

   public float getMoney() {

      return money;

   }

  

   public void setMoney(float money) {

      this.money = money;

   }

  

   @Override

   public String toString() {

      return "User{" +

            "username='" + username + '\'' +

            ", password='" + password + '\'' +

            ", level=" + level +

            ", sex=" + sex +

            ", money=" + money +

            '}';

   }

}

 

4. 编写一个Check注解,这个注解用来标识哪一个字段需要被校验的,扩展性

package dgut.cn.annotation;

  

  import java.lang.annotation.ElementType;

  import java.lang.annotation.Retention;

  import java.lang.annotation.RetentionPolicy;

  import java.lang.annotation.Target;

  

  /**

 * @ClassName:

 * @Description:

 * @Author:zhenghongbin

 * @Date: 2018/10/6 12:05

 * @Version: v1.0

 */

  @Target({ElementType.METHOD, ElementType.FIELD})

  @Retention(RetentionPolicy.RUNTIME)

  public @interface Check {

  

}

5. 给需要被校验的字段添加上@Check注解

public class User {

   @Check

   private String username;

   @Check

   private String password;

   @Check

   private Integer level;

   @Check

   private Boolean sex;

   @Check

   private float money;

  

   public String getUsername() {

      return username;

   }
  ………
}

6. 编写返回类BusiResult和 BusiStatus类

package dgut.cn.status;

  

  /**

 * @ClassName:

 * @Description:

 * @Author:zhenghongbin

 * @Date: 2018/10/6 12:33

 * @Version: v1.0

 */

  public enum BusiStatus {

   /**

    * 系统状态码

    */

   SUCCESS(0,"成功"),

   ERROR(1,"系统错误"),

   PARAM_ERROR(7,"入参错误或参数缺失");

  

  

   private final int status;

  

   private final String message;

  

   private BusiStatus(int status, String message) {

      this.status = status;

      this.message = message;

   }

  

   public int getStatus() {

      return status;

   }

  

   public String getMessage() {

      return message;

   }

}

 

package dgut.cn.status;

  

  /**

 * @ClassName:

 * @Description:

 * @Author:zhenghongbin

 * @Date: 2018/10/6 12:33

 * @Version: v1.0

 */

  public class BusiResult<T> {

   private int code;

   private String message;

   private T data;

   private Object extra;       //冗余字段

   private boolean success = true;

  

   public BusiResult(){}

  

   public BusiResult(BusiStatus status){

      this(status, status.getMessage(),null);

   }

  

   public BusiResult(BusiStatus status, T data){

      this.code = status.getStatus();

      this.message = status.getMessage()+"【"+code+"】";

      this.data = data;

   }

  

   public BusiResult(BusiStatus status, String message, T data){

      this.code = status.getStatus();

      this.message = message+"【"+code+"】";

      this.data = data;

   }

  

   public int getCode() {

      return code;

   }

  

   public String getMessage() {

      return message;

   }

  

   public T getData() {

      return data;

   }

  

   public void setCode(int code) {

      this.code = code;

   }

  

   public void setMessage(String message) {

      this.message = message+"【"+code+"】";

   }

  

   public void setData(T data) {

      this.data = data;

   }

  

   public boolean isSuccess() {

      return success;

   }

  

   public void setSuccess(boolean success) {

      this.success = success;

   }

  

   public Object getExtra() {

      return extra;

   }

  

   public void setExtra(Object extra) {

      this.extra = extra;

   }

}

 

7. 在HelloController中,模拟post提交数据方法,在controller中调用RequestHandler的方法校验

package dgut.cn.controller;

  

  import dgut.cn.diapatcher.RequestHandler;

  import dgut.cn.domain.User;

  import dgut.cn.status.BusiResult;

  import dgut.cn.status.BusiStatus;

  import org.springframework.web.bind.annotation.GetMapping;

  import org.springframework.web.bind.annotation.PostMapping;

  import org.springframework.web.bind.annotation.ResponseBody;

  import org.springframework.web.bind.annotation.RestController;

  

  /**

 * @ClassName:

 * @Description:

 * @Author:zhenghongbin

 * @Date: 2018/10/6 11:50

 * @Version: v1.0

 */

  @RestController

  public class HelloController {

   @GetMapping("/hello")

   public String hello(String name){

      return "hello " + name;

   }

   @PostMapping("/register")

   public BusiResult register(User user){

      //校验出参数,入参数

      BusiResult busiResult = RequestHandler.handler(user);

      if(busiResult!=null){

         return busiResult;

      }else{

         return new BusiResult(BusiStatus.SUCCESS);

      }

  

   }

}
 

8. 在RequestHandler利用反射检验

package dgut.cn.diapatcher;

  

  import dgut.cn.annotation.Check;

  import dgut.cn.status.BusiResult;

  import dgut.cn.status.BusiStatus;

  import org.slf4j.Logger;

  import org.slf4j.LoggerFactory;

  

  import java.lang.reflect.Field;

  import java.lang.reflect.Method;

  

  /**

 * @ClassName:

 * @Description:

 * @Author:zhenghongbin

 * @Date: 2018/10/6 12:37

 * @Version: v1.0

 */

  public class RequestHandler {

   static Logger logger = LoggerFactory.getLogger(RequestHandler.class);

  

   public static BusiResult handler(Object object) {

      BusiResult busiResult = new BusiResult(BusiStatus.PARAM_ERROR);

      //1. 如果入参数实体为空,返回入参数错误

      if(object==null){

         return  busiResult;

      }

      Class<?>  cls = object.getClass();

      try {

         Field[] fields = cls.getDeclaredFields();

         for(Field field : fields ){

  

            //2.0 如果头部有注解check

            if(field.isAnnotationPresent(Check.class)){

               //获取方法名 username = getUsername.但是如果是boolean类型的话,那么是isUsername

               if("class java.lang.Boolean".equals(field.getGenericType().toString())){

                  String methodName = "is" + field.getName().substring(0, 1).toUpperCase() +

                        field.getName().substring(1);

                  Method method = cls.getMethod(methodName, null);

                  Object value = method.invoke(object, null);

                  if (value == null) {

                     return busiResult;

                  }

               }else if("float".equals(field.getGenericType().toString())){

                  String methodName = "get" + field.getName().substring(0, 1).toUpperCase() +

                        field.getName().substring(1);

                  Method method = cls.getMethod(methodName, null);

                  Object value = method.invoke(object, null);

                  if (value.toString().equals("0.0")) {

                     return busiResult;

                  }

               }else{

                  String methodName = "get" + field.getName().substring(0, 1).toUpperCase() +

                        field.getName().substring(1);

                  Method method = cls.getMethod(methodName, null);

                  Object value = method.invoke(object, null);

                  if (value == null) {

                     return busiResult;

                  }

               }

  

            }

         }

      }catch (Exception e){

         logger.error("反射获取" + cls.getName() + "时失败, msg: " + e);

  

      }

  

  

      return null;

   }

}

9.结果演示 – postman

 

 

此致,我们的自动校验就完成了。

猜你喜欢

转载自blog.csdn.net/xiaozhegaa/article/details/82951110