问题描述
我试图在任何情况下都使 500 Internal Server Error
变为 400 Bad Request
。
这是我的异常包结构。
例如,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;
}
}