diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/config/GlobalExceptionHandler.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/config/GlobalExceptionHandler.java index 29ab8801..290c1370 100644 --- a/litemall-core/src/main/java/org/linlinjava/litemall/core/config/GlobalExceptionHandler.java +++ b/litemall-core/src/main/java/org/linlinjava/litemall/core/config/GlobalExceptionHandler.java @@ -1,12 +1,20 @@ package org.linlinjava.litemall.core.config; +import org.hibernate.validator.internal.engine.path.PathImpl; import org.linlinjava.litemall.core.util.ResponseUtil; 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.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.ValidationException; +import java.util.Set; + @ControllerAdvice public class GlobalExceptionHandler { @@ -18,6 +26,13 @@ public class GlobalExceptionHandler { return ResponseUtil.badArgumentValue(); } + @ExceptionHandler(MissingServletRequestParameterException.class) + @ResponseBody + public Object argumentHandler(MissingServletRequestParameterException e){ + e.printStackTrace(); + return ResponseUtil.badArgumentValue(); + } + @ExceptionHandler(HttpMessageNotReadableException.class) @ResponseBody public Object httpMessageNotReadableHandler(HttpMessageNotReadableException e){ @@ -25,6 +40,21 @@ public class GlobalExceptionHandler { return ResponseUtil.badArgumentValue(); } + @ExceptionHandler(ValidationException.class) + @ResponseBody + public Object handle(ValidationException e) { + e.printStackTrace(); + if(e instanceof ConstraintViolationException){ + ConstraintViolationException exs = (ConstraintViolationException) e; + Set> 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) @ResponseBody public Object exceptionHandler(Exception e){ diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/config/ValidatorConfiguration.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/config/ValidatorConfiguration.java new file mode 100644 index 00000000..8b7b481a --- /dev/null +++ b/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; + } +} diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/Order.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/Order.java new file mode 100644 index 00000000..7dcafeeb --- /dev/null +++ b/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[] payload() default {}; +} diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/OrderValidator.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/OrderValidator.java new file mode 100644 index 00000000..2066c3b2 --- /dev/null +++ b/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{ + private List valueList; + + @Override + public void initialize(Order order) { + valueList = new ArrayList(); + 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; + } +} diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/Sort.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/Sort.java new file mode 100644 index 00000000..572d33ac --- /dev/null +++ b/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[] payload() default {}; +} diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/SortValidator.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/validator/SortValidator.java new file mode 100644 index 00000000..e2601647 --- /dev/null +++ b/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{ + private List valueList; + + @Override + public void initialize(Sort sort) { + valueList = new ArrayList(); + 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; + } +}