处理 Spring Boot 异常的最佳选择/替代方案是什么?

rmbxnbpk  于 2022-11-21  发布在  Spring
关注(0)|答案(1)|浏览(122)

现在我使用这个异常处理的例子:

//get an object of type curse by id
//in the service file, this findCurseById() method throws a 
//CursaNotFoundException

@GetMapping("/{id}")
public ResponseEntity<curse> getCursaById (@PathVariable("id") Long id) {

        curse c = curseService.findCurseById(id);
        return new ResponseEntity<>(c, HttpStatus.OK);

}

//so if not found, this will return the message of the error

@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(CursaNotFoundException.class)
public String noCursaFound(CursaNotFoundException ex) {
    return ex.getMessage();
}

这是我的例外

public class CursaNotFoundException extends RuntimeException {
    public CursaNotFoundException(String s) {
        super(s);

    }
}

将来我想使用Angular作为前端,所以我真的不知道我应该如何处理后端的异常。对于这个例子,让我们假设,我应该在noCursaFound()方法中将页面重定向到template.html页面,还是应该返回其他东西?json还是其他什么?我找不到任何有用的东西。谢谢

sd2nnvve

sd2nnvve1#

我建议将错误处理保持在RESTAPI级别,而不要重定向到服务器端的另一个HTML页面。Angular客户端应用程序使用API响应,并在需要时重定向到template.html。
此外,如果后端在异常发生时返回一个ApiError,并显示一条消息和(可选)一个错误代码,效果会更好:

public class ApiError {
    private String message;
    private String code;
}

并在单独的类ExceptionHandler中处理异常,ExceptionHandler@ControllerAdvice注解:

@ControllerAdvice
public class ExceptionHandler {
    @ExceptionHandler(value = CursaNotFoundException.class)
    public ResponseEntity cursaNotFoundException(CursaNotFoundException cursaNotFoundException) {
        ApiError error = new ApiError();
        error.setMessase(cursaNotFoundException.getMessage());
        error.setCode(cursaNotFoundException.getCode());
        return new ResponseEntity(error, HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<> genericException(Exception exception) {
        ApiError error = new ApiError();
        error.setMessase(exception.getMessage());
        error.setCode("GENERIC_ERROR");
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

相关问题