如何处理Spring Boot REST API控制器中的异常?



我对如何处理Spring Boot Rest API中控制器的异常感到困惑。现在我在服务类中抛出一些异常,像这样:

public Optional<Item> getSpecificItem(Long itemId) throws Exception {
return Optional.ofNullable(itemRepository.findById(itemId).
orElseThrow(() -> new Exception("Item with that id doesn't exist")));
}

我不知道这是不是正确的方法,但它是有效的,我愿意接受批评。对于控制器类,我不知道它应该是什么样子,我看到了一些带有@ControllerAdvice和每个控制器的异常的例子,这对我来说看起来有点糟糕。我可以有一个全局异常类的所有控制器?这是一个好的实践吗?

看了一些例子,我不知道它们是否正确。

如果您不使用一般异常,则@ControllerAdvice是好的。例如,如果您定义了规范异常,例如SkyIsRedException。所以,它会被扔到任何它能抓到的地方。

@ControllerAdvice
public class ExampleAdvice {
@ExceptionHandler(SkyIsRedException.class)
@ResponseCode(HttpStatus.NOT_FOUND) // <- not required
public void methodName1() { ... }
@ExceptionHandler(SkyIsGreenException.class)
public void methodName2() { ... }
}

你也可以在控制器中加入@ExceptionHandler,所以如果控制器的任何方法都会抛出这个SkyIsRedException,它就会被激活。

我不建议所有的都使用Exception。你只是在伤害你自己。


更新:

// annotations
public class Controller {
// annotations
public Optional<Item> getSpecificItem(Long itemId) throws ItemNotExistException {
return Optional.ofNullable(itemRepository.findById(itemId).
orElseThrow(() -> new ItemNotExistException("Item with that id doesn't exist")));
}
// Controller specific exception handler, not central like @ControllerAdvice
@ExceptionHandler(ItemNotExistException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String itemNotExistExceptionHandler(ItemNotExistException ex) {
return ex.getMessage(); // example
{
}

最新更新