1号坑: 参数长度校验时特殊字符经过url编码时 1位变3位长度校验会出现问题
通过全局异常处理器 来拦截参数校验的异常 进行统一的参数校验处理
导入jar包
org.springframework.boot
spring-boot-starter-validation
验证配置
package com.***.config;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
/**
* 全局验证配置
*
* @author imsjw
* @Date Created in 15:42 2018/6/7
*/
@Configuration
public class ValidatorConfig {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
/**设置validator模式为快速失败返回*/
postProcessor.setValidator(validator());
return postProcessor;
}
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.addProperty("hibernate.validator.fail_fast", "true")
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
return validator;
}
}
全局异常处理
package com.***.config;
import com.***.base.BaseException;
import com.***.entity.ExceptionResult;
import com.***.util.UUIDUtil;
import jdk.management.resource.internal.inst.StaticInstrumentation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.UnauthenticatedException;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.validation.ValidationException;
/**
* 全局异常处理器
*
* @author imsjw
* @Date Created in 10:45 2018/6/6
*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 基本异常处理
*
* @param e
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public ExceptionResult basicExceptionHandling(Exception e) {
ExceptionResult result = new ExceptionResult(UUIDUtil.random(), false, "未知错误");
printfExceptionInfo(e, result);
return result;
}
@ResponseBody
@ExceptionHandler(value = BaseException.class)
public ExceptionResult baseExceptionHandling(BaseException e) {
ExceptionResult result = new ExceptionResult(UUIDUtil.random(), false, "错误");
printfExceptionInfo(e.getException(), result, e.getMessage());
return result;
}
/**
* 用于Controller参数校验错误的统一处理
*
* @param e
* @return
*/
@ResponseBody
@ExceptionHandler(value = ValidationException.class)
public ExceptionResult validationExceptionHandling(ValidationException e) {
ExceptionResult result = new ExceptionResult(UUIDUtil.random(), false, "参数不符合规则");
printfExceptionInfo(e, result);
return result;
}
private void printfExceptionInfo(Exception e, ExceptionResult result) {
if (result.getData() != null) {
printfExceptionInfo(e, result, result.getData().toString());
} else {
printfExceptionInfo(e, result, null);
}
}
private void printfExceptionInfo(Exception e, ExceptionResult result, String title) {
StringBuffer strBuf = new StringBuffer();
strBuf.append("\r\n**********异常信息开始**********\r\n");
strBuf.append("ID:");
strBuf.append(result.getId());
strBuf.append(" 标题:");
strBuf.append(title);
strBuf.append("\r\n");
if (e != null) {
strBuf.append(e.getMessage());
strBuf.append("\r\n");
strBuf.append(e.toString());
strBuf.append("\r\n");
StackTraceElement[] stackTrace = e.getStackTrace();
if (stackTrace != null) {
for (StackTraceElement t : stackTrace) {
strBuf.append(t.toString());
strBuf.append("\r\n");
}
}
}
strBuf.append("**********异常信息结束**********");
strBuf.append("\r\n");
log.error(strBuf.toString());
}
}
BaseException
package com.***.base;
import java.io.Serializable;
/**
* 核心实体类
*
* @author imsjw
* @Date Created in 22:13 2018/6/14
*/
public abstract class BaseEntity implements Serializable {
/**
* 返回一个可以返回给用户的数据结构
*
* @return Object
*/
public abstract T toResult();
}
ExceptionResult
package com.***.entity;
/**
* 返回给用户的异常信息结果
*
* @author imsjw
* @Date Created in 16:07 2018/6/7
*/
public class ExceptionResult extends Result {
/**
* 异常的唯一表示符
*/
private String id;
public ExceptionResult() {
}
public ExceptionResult(String id, boolean state, Object data) {
super(state,data);
this.id = id;
}
@Override
public String toString() {
return "ExceptionResult{" +
"id='" + id + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
Result
package com.***.entity;
import com.***.base.BaseEntity;
import java.util.ArrayList;
import java.util.List;
/**
* 提供的网络接口返回的基类
*
* @author imsjw
* @Date Created in 20:37 2018/6/5
*/
public class Result {
private boolean state;
private Object data;
public Result() {
}
public Result(boolean state) {
this.state = state;
}
public Result(boolean state, Object data) {
this.state = state;
if (data != null) {
if (data instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) data;
this.data = baseEntity.toResult();
return;
}
if (data instanceof List) {
List list = (List) data;
if ((!list.isEmpty()) && list.get(0) instanceof BaseEntity) {
List baseEntities = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
BaseEntity baseEntity = (BaseEntity) list.get(i);
baseEntities.add(baseEntity.toResult());
}
this.data = baseEntities;
return;
}
}
}
this.data = data;
}
@Override
public String toString() {
return "Result{" +
"state=" + state +
", data=" + data +
'}';
}
public boolean isState() {
return state;
}
public void setState(boolean state) {
this.state = state;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
BaseEntity
package com.***.base;
import java.io.Serializable;
/**
* 核心实体类
*
* @author imsjw
* @Date Created in 22:13 2018/6/14
*/
public abstract class BaseEntity implements Serializable {
/**
* 返回一个可以返回给用户的数据结构
*
* @return Object
*/
public abstract T toResult();
}