簡體   English   中英

將DAO層中的異常拋給控制器是一種好習慣嗎?

[英]Is it good practice to throw exception from DAO layer to controller?

我正在編寫一個REST API。 我的DAO層可能有兩個例外,即Exception_XException_Y 如果我在DAO層遇到異常Exception_X ,我的控制器應返回狀態碼200 ,如果Exception_Y則返回401 ,如果一切順利,控制器應返回201 現在我在想什么,我會拋出遇到的異常,因為它是從DAO層到控制器通過服務層,在控制器的catch塊中我將返回響應。 可接受還是有其他標准方式?

是的,這是一種非常可接受的方式。 但是,我建議為REST控制器實現異常處理程序,而不是使用try-catch 這樣,您就不必混亂REST方法。

此外,最好在REST層中為錯誤消息創建一個模型對象 - ErrorResponse ,並提供適當的信息:

class ErrorResponse {
    int statusCode;
    String errorMessage;
}

並從異常處理程序返回它的對象。 順便說一下,您還可以使用@ResponseStatus注釋將您的異常類直接映射到響應:

@ResponseStatus(value=401, reason="message")
class Exception_Y extends RuntimeException {
} 

然后,您不必為該異常編寫異常處理程序。

我的建議是將任何未經檢查的異常與服務層一起包裝,以實現松散耦合和干凈的抽象。 保持控制器免受條件限制,讓服務層處理這種痛苦。

如果將外部暴露在外部包裝面向服務異常的異常,請記住安全問題,這也有助於實現泛型異常,例如PersistentException,ServiceException等,同時保持良好的解耦程度

要全局處理異常,可以使用帶有JsonExceptionModel的spring inbuild ControllerAdvice批注進行格式化的錯誤響應。

@ControllerAdvice
public class GlobalExceptionHandler {

@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(SQLException.class)
    public Map<String, Object> handleSQLException(HttpServletRequest request, Exception ex) {
        //json response here
    }
}


public class JsonExceptionModel  {
    private int code;
    private String type;
    private String url;
    private String message;
    private String moreInfo;

// getters/setters here
}

我建議你選擇Spring提供的Exception Resolver。 Spring Framework提供了HandlerExceptionResolver接口,我們可以實現它來創建全局異常處理程序。 我們還可以覆蓋它以使用我們的應用程序特定更改創建自己的全局處理程序,例如記錄異常消息。

以下是HandlerExceptionResolver的示例實現,它將滿足您的需求

public class RestResponseStatusExceptionResolver extends HandlerExceptionResolver {

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
                                              Exception ex) {
        if (ex instanceof InvalidInputException) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return handleException(ex);
        } else if (ex instanceof ResourceNotFoundException) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return handleException(ex);
        }


//Adding error details to modelView object
modelAndView.addObject("errors", ErrorDetails);



// Custom error message details
public class ErrorDetails {
    private String code;
    private List<String> data;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM