基于反射的自动校验工具类
目录
4. 编写一个Check注解,这个注解用来标识哪一个字段需要被校验的,扩展性
6. 编写返回类BusiResult和 BusiStatus类
7. 在HelloController中,模拟post提交数据方法,在controller中调用RequestHandler的方法校验
基于反射的自动校验工具类
分享基于反射的自动检验工具类~~开发N个接口发现,每个接口都要进行非空检验,写了一个工具类帮助自己进行滤空操作,建议在RequestHandler中检验的检验逻辑根据自己的逻辑而定。非通用。
-
源码
https://download.****.net/download/xiaozhegaa/10703385
-
代码编写
1. 搭建SpringBoot项目,参考一下的文章:
https://blog.****.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