必要
現在、同社のフレームワークでは例外処理をカプセル化しているが、@Validated アノテーションを使ってフィールドを判定する場合、返される例外が例外スタックの塊となるため、@Validated がスローする例外を再度カスタマイズする必要がある。 MethodArgumentNotValidException インターセプトして処理し、スローします。
達成
カスタム例外インターセプト
ApiResult は会社のフレームワーク自体によってカプセル化されるため、同じフレームワークに統合する必要があります。
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @author cf
* @date 2023/4/12上午 11:31
*/
@Order(999999)
@RestControllerAdvice
public class ConfigExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ApiResult<?> handlerException(MethodArgumentNotValidException e) {
MethodArgumentNotValidExceptionAction methodArgumentNotValidExceptionAction = new MethodArgumentNotValidExceptionAction(e.getParameter(),e.getBindingResult());
return ApiResult.error(methodArgumentNotValidExceptionAction.getMessage());
}
}
再写MethodArgumentNotValidExceptionAction
import org.springframework.core.MethodParameter;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import java.util.Iterator;
/**
* @author cf
* @description: 针对Validated 异常抛出处理
* @date 2023/4/12下午 2:05
*/
public class MethodArgumentNotValidExceptionAction extends Exception {
private final MethodParameter parameter;
private final BindingResult bindingResult;
public MethodArgumentNotValidExceptionAction(MethodParameter parameter, BindingResult bindingResult) {
this.parameter = parameter;
this.bindingResult = bindingResult;
}
public MethodParameter getParameter() {
return this.parameter;
}
public BindingResult getBindingResult() {
return this.bindingResult;
}
//这里对异常进行了封装
public String getMessage() {
Iterator var2 = this.bindingResult.getAllErrors().iterator();
StringBuilder sb = new StringBuilder();
while (var2.hasNext()) {
ObjectError error = (ObjectError) var2.next();
sb.append("[").append(error.getDefaultMessage()).append("] ");
}
return sb.toString();
}
}
注意点
スキャン時にこのディレクトリのスキャンを追加することをお勧めします。@ComponentScan の内部