统一的异常处理中心,Validated自定义异常返回

import com.ruyicai.lottery.api.resp.RespBody;
import com.ruyicai.lottery.util.ErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.validation.ConstraintViolationException;


@ControllerAdvice
public class RycExceptionAdvice {

private static Logger logger = LoggerFactory.getLogger(RycExceptionAdvice.class);

private static final RespBody ERROR = RespBody.fail(ErrorCode.ERROR);

@ExceptionHandler({Exception.class})
public ResponseEntity handleRunTimeException(Exception e) {
logger.error("system exception", e);
return new ResponseEntity<>(RespBody.fail("403", e.getMessage()), HttpStatus.FORBIDDEN);
}
@ExceptionHandler({IllegalArgumentException.class})
public ResponseEntity<Object> handleRunTimeException(IllegalArgumentException e) {
logger.error("IllegalArgumentException {}", e);
return ResponseEntity.ok(RespBody.fail(ErrorCode.PARAMTER_ERROR.value,e.getMessage()));
}
@ExceptionHandler({MethodArgumentNotValidException.class})
public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {

//这个就是处理参数异常报错的
logger.error("MethodArgumentNotValidException {} ", e.getBindingResult().getFieldErrors());
return ResponseEntity.ok(RespBody.fail(ErrorCode.PARAMTER_ERROR.value,e.getBindingResult().getFieldError().getDefaultMessage()));
}
@ExceptionHandler({ConstraintViolationException.class})
public ResponseEntity handleConstraintViolationException(ConstraintViolationException e) {
logger.error("ConstraintViolationException {} ", e.getConstraintViolations().stream().findFirst().get().getMessage());
return ResponseEntity.ok(RespBody.fail(ErrorCode.PARAMTER_ERROR.value,e.getConstraintViolations().stream().findFirst().get().getMessage()));
}

}

Validated注解可以在进入controller接口之前自动校验参数,避免了大量的if else语句和try catch语句的冗杂代码。Controller中每一个接口请求都要对异常进行处理,可以使用@ControllerAdvice和@ExceptionHandler注解来实现统一异常处理。 具体使用步骤如下: 1. 在controller类中的方法参数上添加@Validated注解,指定需要校验的实体类。例如: ```java @PostMapping("/example") public void exampleMethod(@Validated @RequestBody ExampleDto exampleDto) { // 方法逻辑 } ``` 2. 在统一异常处理类中编写异常处理方法,并使用@ExceptionHandler注解标注。例如: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<ErrorResponse> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { BindingResult bindingResult = e.getBindingResult(); String errorMsg = bindingResult.getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(",")); ErrorResponse errorResponse = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), errorMsg); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse); } } ``` 3. 在异常处理方法中,可以通过MethodArgumentNotValidException类获取校验失败的详细信息,例如字段名称和校验错误消息。可以根据具体需求进行处理,返回自定义的错误响应或统一的错误码和错误消息。 这样,当请求进入controller接口时,Validated注解会自动校验参数,并在校验失败时抛出MethodArgumentNotValidException异常统一异常处理类会捕获该异常,根据需要进行处理,并返回相应的错误响应。这样就实现了Validated统一异常处理的结合使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值