平时在写代码的时候,特别是controller,我们总会有一堆参数验证,大家也都会感到特别烦,那么如何处理呢?Spring为我们提供了很好的验证注解 @Validated,相信大家也比较常用。
但是,当我们自定义异常的时候就麻烦了,不过,别着急,Spring还为我们提供了@ControllerAdvice@ExceptionHandler注解来帮助我们处理异常。
下面附上代码:
controller
@RequestMapping(value = "/searchTest", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public BaseResponse searchTest(@RequestBody @Validated SearchTestReq req) {
int a = 1/0;
return new BaseResponse();
}
Model:注意属性上的注解,NotBlank适用于String,NotNull则适用于Long Integer等类型
@Data
@ToString
public class SearchTestReq {
@NotBlank(message = "URL can't null")
private String imgURL;
@NotNull(message = "userId Can't be empty")
@Min(value = 0,message = "userId No less than 0")
private Long userId;
@NotBlank(message = "orderID Can't be empty")
private String orderId;
}
异常捕获类:
上面两项做完以后,框架就可以帮我们处理异常了,但是返回的异常信息并不是我们想要的下面附上最重要的异常处理类:
import org.apache.commons.lang.text.StrBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* 异常处理
* spring mvc提供了ControllerAdvice注解对异常进行统一的处理
* @author Admin
* @date 2019年9月2日18:12:59
*/
@ControllerAdvice
public class ExceptionAdvice {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 这里统一处理参数异常可根据自己需要封装返回信息
* 当不符合注解上的验证规则,会被该方法捕获到
* @param ex 方法参数异常
* @return BaseResponse
*/
@ExceptionHandler
@ResponseBody
public BaseResponse handleParamsException(MethodArgumentNotValidException ex){
BindingResult bindingResult = ex.getBindingResult();
List<FieldError> errors = bindingResult.getFieldErrors();
StrBuilder errorMsg = new StrBuilder();
errorMsg.append("param exception ");
for (FieldError error : errors){
errorMsg.append(error.getField());
errorMsg.append(":");
errorMsg.append(error.getDefaultMessage());
errorMsg.append("; ");
}
return new BaseResponse(BaseResponse.PARAM_ERROR,errorMsg.toString());
}
/**
* 处理方法的顶级异常信息,可以处理事务等等
* 比如我controller里面的1/0异常就会被该方法捕获到
* controller里面就不再捕获了
* @param ex 异常
* @return BaseResponse
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public BaseResponse handleParamsException(Exception ex){
logger.error("system error:{}",ex);
return new BaseResponse(BaseResponse.SYSTEM_ERROR,ex.getMessage());
}
}