我想在全局范围内返回关于未处理异常的 400 而不是 500 的状态代码

问题描述

我试图在任何情况下都使 500 Internal Server Error 变为 400 Bad Request

这是我的异常包结构。

Directory image

例如,ConflictExeption 看起来像这样。

@ResponseStatus(HttpStatus.CONFLICT)
public class ConflictException extends ApiException {
    public ConflictException(String message) {
        super(message);
    }

    public ConflictException() {
        this("Conflict Exception.");
    }
}
public class ApiException extends RuntimeException {
    public ApiException(String message) {
        super(message);
    }
}
public class UserEmailInUseException extends ConflictException{

    public static final String MESSAGE = "Desired email is already in use.";

    public UserEmailInUseException() {
        super(MESSAGE);
    }
}

下面是我的简单服务代码


@Service
public class UseRSService {
    @Transactional
        public UserInfoResponseDto signUp(UserSignupRequestDto requestDto) {
            if (usersRepository.findByEmail(requestDto.getEmail()).isPresent()) throw new 
                UserEmailInUseException();
        return new UserInfoResponseDto(usersRepository.save(requestDto.toEntity()));

    }

}

UserEmailInUseException 扩展 ConflictException

就我而言,在与 MariaDB 进行交易时发生一些违规行为时会发生 500 错误

简单地说,我只想返回状态码 400 而不是 500,这里不处理异常。

提前致谢!

另外,我试过下面这个例子,它似乎发送了 500.. Link

解决方法

首先,您将它映射到 CONFLICT 而不是 BAD_REQUEST。您是否尝试过以下注释设置?

@ResponseStatus(HttpStatus.BAD_REQUEST)

如果您不想更改现有的 ConflictException,请尝试引入新的基本异常,如下所示:

@ResponseStatus(HttpStatus.BAD_REQUEST)
public class BadRequestException extends ApiException {
    // [...]
}
,

你试过了吗:

@RestControllerAdvice
public class RestErrorHandler {

    @ExceptionHandler
    @ResponseStatus(BAD_REQUEST)
    Exception handleUnhandledException(Exception e) {
        return e;
    }
}