统一的异常处理工具

1、统一处理参数校验

对于请求参数校验,我们可以使用spring的validation包,依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
   <version>2.4.1</version>
</dependency>

引入jar包之后便可以在请求参数那里使用@Valid进行校验,校验的规则就在参数bean的属性上加对应的校验规则注解即可。

 @PostMapping("/reg")
   public ResultWrapper register(@RequestBody @Valid UserMemberDTO userMemberDTO) {
        String result = umsMemberService.register(userMemberDTO);
        return ResultWrapper.getSuccessBuilder().data(result).build();
    }
import lombok.Data;
import lombok.ToString;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;

@Data
@ToString
public class UserMemberDTO implements Serializable {

    @Size(max = 8, min = 2, message = "名称长度必须在2~8个字符")
    private String username;
    @NotNull
    private String password;

    private String icon;

    @Email
    private String email;

    private String nickName;
}

校验规则使用的是javax.validation.constraints包下面的注解。

对于获取校验之后,如何将校验结果返回给前端,需要使用统一的校验结果处理类ResponseEntityExceptionHandler

import com.msb.dongbao.common.base.result.ResultWrapper;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class ValidateHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                                  HttpHeaders headers, HttpStatus status, WebRequest request) {
        StringBuilder sb = new StringBuilder();
        for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
            sb.append(" "+fieldError.getDefaultMessage());
            break;
        }
        return new ResponseEntity<>(ResultWrapper.builder().code(102).msg(sb.toString()).build(),
                HttpStatus.OK);
    }
}

在这里使用@RestControllerAdvice和使用@ControllerAdvice 效果是一样的。因为返回值是ResponseEntity。

 

2、统一异常返回处理

import com.msb.dongbao.common.base.result.ResultWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 统一处理全局异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public ResultWrapper globalException(Exception e) {
        log.error("globalException",e);
        return ResultWrapper.getFailBuilder().data(e.getMessage()).build();
    }

}

使用@ExceptionHandler注解进行拦截所有Exception,当然可以自定义Exception进行拦截,只需要将Exception.class替换为自定义类.class。

使用@RestControllerAdvice来实现请求的返回,可以使用自定义的返回对象。 如果使用@ControllerAdvice 就不能使用自定义的返回对象,会报404错误。如果要使用@ControllerAdvice, 返回对象必须是ResponseEntity,前端才不会404。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值