Browse Source

:bento: 新增全局表单验证

Aron 6 years ago
parent
commit
9e94dde0d4

+ 2 - 4
src/main/java/com/ifast/common/annotation/Log.java

@@ -1,9 +1,6 @@
 package com.ifast.common.annotation;
 
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.*;
 
 /**
  * <pre>
@@ -13,6 +10,7 @@ import java.lang.annotation.RetentionPolicy;
  */
 @Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
+@Inherited
 public @interface Log {
 	String value() default "";
 }

+ 8 - 0
src/main/java/com/ifast/common/exception/handler/ApplicationExceptionHandler.java

@@ -28,6 +28,14 @@ public class ApplicationExceptionHandler {
     public final static String ERROR_DEFAULT_PAGE = "error/error";
 
     /**
+     * 参数校验异常
+     */
+    @ExceptionHandler(IllegalArgumentException.class)
+    public Result<String> illegalArgumentException(IllegalArgumentException e) {
+        return Result.build(EnumErrorCode.illegalArgument.getCode(), e.getMessage());
+    }
+
+    /**
      * API异常
      */
     @ExceptionHandler(IFastApiException.class)

+ 1 - 0
src/main/java/com/ifast/common/type/EnumErrorCode.java

@@ -11,6 +11,7 @@ public enum EnumErrorCode {
 
     ok(200, "请求成功")
     , unknowFail(500, "未知错误")
+    , illegalArgument(400, "参数校验异常")
     , pageNotFound(404, "页面不存在")
     , notAuthorization(405, "未授权")
     

+ 15 - 0
src/main/java/com/ifast/common/validation/ValidForm.java

@@ -0,0 +1,15 @@
+package com.ifast.common.validation;
+
+import java.lang.annotation.*;
+
+/**
+ * <pre>
+ * 自动表单验注解
+ * </pre>
+ * <small> 2018/9/4 12:00 | Aron</small>
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface ValidForm {
+}

+ 46 - 0
src/main/java/com/ifast/common/validation/ValidFormAspect.java

@@ -0,0 +1,46 @@
+package com.ifast.common.validation;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * <pre>
+ * 全局表单自动验证
+ * </pre>
+ * <small> 2018年3月22日 | Aron</small>
+ */
+@Aspect
+@Component
+public class ValidFormAspect {
+
+    private Logger log = LoggerFactory.getLogger(getClass());
+
+    @Pointcut("execution(* com.ifast..controller.*.*(..))")
+    public void validFormAspect() {
+    }
+
+    @Around("validFormAspect()")
+    public Object around(ProceedingJoinPoint point) throws Throwable {
+        Object[] args = point.getArgs();
+        for(Object arg : args){
+            ValidForm validForm = arg.getClass().getAnnotation(ValidForm.class);
+            if(validForm != null){
+                ValidationResult validationResult = ValidateUtils.validateEntity(arg);
+                if(validationResult.isHasErrors()){
+                    throw new IllegalArgumentException(validationResult.toString());
+                }
+            }
+        }
+        Object result = point.proceed();
+        return result;
+    }
+
+
+    
+
+}

+ 54 - 0
src/main/java/com/ifast/common/validation/ValidateUtils.java

@@ -0,0 +1,54 @@
+package com.ifast.common.validation;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.groups.Default;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <pre>
+ *
+ * </pre>
+ * <small> 2018/9/4 12:04 | Aron</small>
+ */
+public class ValidateUtils {
+
+    private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
+
+    public static <T> ValidationResult validateEntity(T obj) {
+        ValidationResult result = new ValidationResult();
+        Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class);
+        if (ValidateUtils.isNotEmpty(set)) {
+            result.setHasErrors(true);
+            List<String> errorMsg = new ArrayList<>();
+            for (ConstraintViolation<T> cv : set) {
+                errorMsg.add(cv.getPropertyPath() + cv.getMessage());
+            }
+            result.setErrorMsg(errorMsg);
+        }
+        return result;
+    }
+
+    public static <T> ValidationResult validateProperty(T obj, String propertyName) {
+        ValidationResult result = new ValidationResult();
+        Set<ConstraintViolation<T>> set = validator.validateProperty(obj, propertyName, Default.class);
+        if (ValidateUtils.isNotEmpty(set)) {
+            result.setHasErrors(true);
+            List<String> errorMsg = new ArrayList<>();
+            for (ConstraintViolation<T> cv : set) {
+                errorMsg.add(cv.getMessageTemplate());
+            }
+            result.setErrorMsg(errorMsg);
+        }
+        return result;
+    }
+
+    private static boolean isNotEmpty(Collection<?> c) {
+        return (c != null) && (!c.isEmpty());
+    }
+
+}

+ 54 - 0
src/main/java/com/ifast/common/validation/ValidationResult.java

@@ -0,0 +1,54 @@
+package com.ifast.common.validation;
+
+import java.util.List;
+
+/**
+ * 
+ * @author Aron
+ * @date 2017年8月4日
+ */
+public class ValidationResult {
+	
+	//校验结果是否有错
+	private boolean hasErrors;
+	
+	//校验错误信息
+//	private Map<String,String> errorMsg;
+	private List<String> errorMsg;
+	
+
+	public boolean isHasErrors() {
+		return hasErrors;
+	}
+
+	public void setHasErrors(boolean hasErrors) {
+		this.hasErrors = hasErrors;
+	}
+	
+
+	public List<String> getErrorMsg() {
+		return errorMsg;
+	}
+
+	public void setErrorMsg(List<String> errorMsg) {
+		this.errorMsg = errorMsg;
+	}
+
+	@Override
+	public String toString() {
+		String content = "" ;
+		if(errorMsg.size()>0){
+			content=errorMsg.get(0);
+		}
+//		for(int i = 0; i < errorMsg.size(); i++) {
+//			if (i != errorMsg.size() - 1) {
+//				content = content + errorMsg.get(i) + ",";
+//			}
+//			if (i == errorMsg.size() - 1) {
+//				content = content + errorMsg.get(i);
+//			}
+//		}
+		return content;
+	}
+
+}

+ 9 - 4
src/main/java/com/ifast/demo/controller/TestController.java

@@ -1,10 +1,10 @@
 package com.ifast.demo.controller;
 
+import com.ifast.demo.dto.TestValidDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.data.redis.core.ValueOperations;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Set;
@@ -24,14 +24,14 @@ public class TestController {
     @Autowired
     private StringRedisTemplate stringRedisTemplate;
 
-    @RequestMapping("/session")
+    @GetMapping("/session")
     public void session(HttpServletRequest request) {
         System.out.println("request class : " + request.getClass());
         System.out.println("request session : " + request.getSession());
 
     }
 
-    @RequestMapping("/redis")
+    @GetMapping("/redis")
     public void redis() {
         Set<String> keys = stringRedisTemplate.keys("*");
         System.out.println(keys);
@@ -49,6 +49,11 @@ public class TestController {
 
     }
 
+    @PostMapping("/valid")
+    public void valid(@RequestBody TestValidDTO dto) {
+        System.out.println(dto);
+    }
+
 
 
 }

+ 32 - 0
src/main/java/com/ifast/demo/dto/TestValidDTO.java

@@ -0,0 +1,32 @@
+package com.ifast.demo.dto;
+
+import com.ifast.common.validation.ValidForm;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * <pre>
+ *
+ * </pre>
+ * <small> 2018/9/4 16:49 | Aron</small>
+ */
+@ValidForm
+@Data
+public class TestValidDTO {
+
+    @NotNull
+    @Length(max = 20, min = 6)
+    private String name;
+
+    @NotNull
+    @Range(min = 1, max = 120)
+    private Integer age;
+
+    @NotNull
+    @Range(min = 1, max = 3)
+    private Integer sex;
+}
+