Browse Source

feat[litemall-core]: 支持排序校验。

Junling Bu 7 years ago
parent
commit
bc6f8747fe

+ 30 - 0
litemall-core/src/main/java/org/linlinjava/litemall/core/config/GlobalExceptionHandler.java

@@ -1,12 +1,20 @@
 package org.linlinjava.litemall.core.config;
 package org.linlinjava.litemall.core.config;
 
 
+import org.hibernate.validator.internal.engine.path.PathImpl;
 import org.linlinjava.litemall.core.util.ResponseUtil;
 import org.linlinjava.litemall.core.util.ResponseUtil;
 import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
 import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
 
 
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import javax.validation.ValidationException;
+import java.util.Set;
+
 @ControllerAdvice
 @ControllerAdvice
 public class GlobalExceptionHandler {
 public class GlobalExceptionHandler {
 
 
@@ -18,6 +26,13 @@ public class GlobalExceptionHandler {
         return ResponseUtil.badArgumentValue();
         return ResponseUtil.badArgumentValue();
     }
     }
 
 
+    @ExceptionHandler(MissingServletRequestParameterException.class)
+    @ResponseBody
+    public Object argumentHandler(MissingServletRequestParameterException e){
+        e.printStackTrace();
+        return ResponseUtil.badArgumentValue();
+    }
+
     @ExceptionHandler(HttpMessageNotReadableException.class)
     @ExceptionHandler(HttpMessageNotReadableException.class)
     @ResponseBody
     @ResponseBody
     public Object httpMessageNotReadableHandler(HttpMessageNotReadableException e){
     public Object httpMessageNotReadableHandler(HttpMessageNotReadableException e){
@@ -25,6 +40,21 @@ public class GlobalExceptionHandler {
         return ResponseUtil.badArgumentValue();
         return ResponseUtil.badArgumentValue();
     }
     }
 
 
+    @ExceptionHandler(ValidationException.class)
+    @ResponseBody
+    public Object handle(ValidationException e) {
+        e.printStackTrace();
+        if(e instanceof ConstraintViolationException){
+            ConstraintViolationException exs = (ConstraintViolationException) e;
+            Set<ConstraintViolation<?>> violations = exs.getConstraintViolations();
+            for (ConstraintViolation<?> item : violations) {
+                String message = ((PathImpl)item.getPropertyPath()).getLeafNode().getName() +item.getMessage();
+                return ResponseUtil.fail(402, message);
+            }
+        }
+        return ResponseUtil.badArgumentValue();
+    }
+
     @ExceptionHandler(Exception.class)
     @ExceptionHandler(Exception.class)
     @ResponseBody
     @ResponseBody
     public Object exceptionHandler(Exception e){
     public Object exceptionHandler(Exception e){

+ 23 - 0
litemall-core/src/main/java/org/linlinjava/litemall/core/config/ValidatorConfiguration.java

@@ -0,0 +1,23 @@
+package org.linlinjava.litemall.core.config;
+
+import org.hibernate.validator.HibernateValidator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+
+@Configuration
+public class ValidatorConfiguration {
+    @Bean
+    public Validator validator(){
+        ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
+                .configure()
+                .addProperty( "hibernate.validator.fail_fast", "true" )
+                .buildValidatorFactory();
+        Validator validator = validatorFactory.getValidator();
+
+        return validator;
+    }
+}

+ 23 - 0
litemall-core/src/main/java/org/linlinjava/litemall/core/validator/Order.java

@@ -0,0 +1,23 @@
+package org.linlinjava.litemall.core.validator;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Target({ METHOD, FIELD, PARAMETER })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = OrderValidator.class)
+public @interface Order {
+    String message() default "排序类型不支持";
+    String[] accepts() default {"desc", "asc"};
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}

+ 26 - 0
litemall-core/src/main/java/org/linlinjava/litemall/core/validator/OrderValidator.java

@@ -0,0 +1,26 @@
+package org.linlinjava.litemall.core.validator;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.ArrayList;
+import java.util.List;
+
+public class OrderValidator implements ConstraintValidator<Order, String>{
+    private List<String> valueList;
+
+    @Override
+    public void initialize(Order order) {
+        valueList = new ArrayList<String>();
+        for(String val : order.accepts()) {
+            valueList.add(val.toUpperCase());
+        }
+    }
+
+    @Override
+    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
+        if(!valueList.contains(s.toUpperCase())) {
+            return false;
+        }
+        return true;
+    }
+}

+ 23 - 0
litemall-core/src/main/java/org/linlinjava/litemall/core/validator/Sort.java

@@ -0,0 +1,23 @@
+package org.linlinjava.litemall.core.validator;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+@Target({ METHOD, FIELD, PARAMETER })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = SortValidator.class)
+public @interface Sort {
+    String message() default "排序字段不支持";
+    String[] accepts() default {"add_time", "id"};
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}

+ 26 - 0
litemall-core/src/main/java/org/linlinjava/litemall/core/validator/SortValidator.java

@@ -0,0 +1,26 @@
+package org.linlinjava.litemall.core.validator;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SortValidator implements ConstraintValidator<Sort, String>{
+    private List<String> valueList;
+
+    @Override
+    public void initialize(Sort sort) {
+        valueList = new ArrayList<String>();
+        for(String val : sort.accepts()) {
+            valueList.add(val.toUpperCase());
+        }
+    }
+
+    @Override
+    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
+        if(!valueList.contains(s.toUpperCase())) {
+            return false;
+        }
+        return true;
+    }
+}