1.背景:方法入参过多,用StringUtils.isBlank判断很麻烦,而且很不美观,如下图
@PostMapping("demo")
void demo(@RequestBody OrderEntity orderEntity){
if(StringUtils.isBlank(orderEntity.getOrderId())){
log.info("orderID不能为空。。。");
return;
}
if(StringUtils.isBlank(orderEntity.getOrderStatus())){
log.info("orderStatus不能为空。。。");
return;
}
log.info("测试方法demo。。。");
}
2.接下来我们了解下validation-api,如何判断入参
2.1首先导入相关依赖:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
2.2实体类加上注解
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class OrderEntity {
@NotBlank(message = "订单号不能为空")
String orderId;
@NotNull(message = "订单状态不能为空")
Integer orderStatus;
}
2.3测试controller,加上@Valid注解
@Slf4j
@RestController
@RequestMapping("test")
public class TestController {
@PostMapping("demo")
BaseResponse<?> demo(@Valid @RequestBody OrderEntity orderEntity){
log.info("测试方法demo。。。");
return new BaseResponse<>();
}
}
2.4postman测试故意不传参数
代码抛出异常,返回一个json数据格式,其中"defaultMessage": "订单号不能为空",这才是我们想要返回给前端的信息,而不是整个json。
2.5 利用aop捕获异常
写一个异常类GlobalExceptionHandler ,利用@ControllerAdvice和@ExceptionHandler捕获异常
package com.front.aop;
import com.front.common.enums.ErrorCodeEnum;
import com.front.common.response.BaseResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
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 java.util.List;
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 忽略参数异常处理器
* @param e 忽略参数异常
* @return BaseResponse
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MissingServletRequestParameterException.class)
@ResponseBody
public BaseResponse<?> parameterMissingExceptionHandler(MissingServletRequestParameterException e) {
log.error("忽略参数异常处理器", e);
return new BaseResponse<>(ErrorCodeEnum.FAIL.getCode(), "请求参数 " + e.getParameterName() + " 不能为空");
}
/**
* 缺少请求体异常处理器
* @param e 缺少请求体异常
* @return BaseResponse
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseBody
public BaseResponse<?> parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e) {
log.error("", e);
return new BaseResponse<>(ErrorCodeEnum.FAIL.getCode(), "参数体不能为空");
}
/**
* 参数效验异常处理器
* @param e 参数验证异常
* @return ResponseInfo
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public BaseResponse<?> parameterExceptionHandler(MethodArgumentNotValidException e) {
log.error("参数效验异常处理器", e);
// 获取异常信息
BindingResult exceptions = e.getBindingResult();
// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
if (exceptions.hasErrors()) {
List<ObjectError> errors = exceptions.getAllErrors();
if (!errors.isEmpty()) {
// 这里列出了全部错误参数,按正常逻辑,只需要第一条错误即可
FieldError fieldError = (FieldError) errors.get(0);
return new BaseResponse<>(ErrorCodeEnum.FAIL.getCode(), fieldError.getDefaultMessage());
}
}
return new BaseResponse<>(ErrorCodeEnum.FAIL.getCode());
}
/**
* 自定义参数错误异常处理器
* @param e 自定义参数
* @return ResponseInfo
*/
/*@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({BusinessException.class})
@ResponseBody
public BaseResponse paramExceptionHandler(ParamaErrorException e) {
log.error("", e);
// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
if (!StringUtils.isEmpty(e.getMessage())) {
return new BaseResponse(ErrorCodeEnum.FAIL.getCode(), e.getMessage());
}
return new BaseResponse(ErrorCodeEnum.FAIL);
}*/
/**
* 其他异常
* @param e
* @return
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({Exception.class})
@ResponseBody
public BaseResponse<?> otherExceptionHandler(Exception e) {
log.error("其他异常", e);
// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
if (!StringUtils.isEmpty(e.getMessage())) {
return new BaseResponse<>(ErrorCodeEnum.FAIL.getCode(), e.getMessage());
}
return new BaseResponse<>(ErrorCodeEnum.FAIL.getCode());
}
}
BaseResponse:
package com.front.common.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
@Data
@AllArgsConstructor
public class BaseResponse<T> implements Serializable {
private static final String SUCCESS = "SUCCESS";
private static final String FAIL = "FAIL";
private String code="200";
private String message="操作成功";
private T data;
public BaseResponse() {
}
public BaseResponse(String code, String message) {
this.code = code;
this.message = message;
}
public BaseResponse(String code) {
this.code = code;
}
public void setData(T data) {
this.data = data;
}
}
ErrorCodeEnum :
package com.front.common.enums;
import lombok.AllArgsConstructor;
import lombok.Data;
@AllArgsConstructor
public enum ErrorCodeEnum {
FAIL("400", "失败");
final String code;
final String detail;
public String getCode() {
return this.code;
}
public String getDetail() {
return this.detail;
}
}
2.6启动项目postman再测试一次
至此完结!!!