2012-07-09 114 views
0

我看到一些Spring/Hibernate代碼在DAO接口方法中聲明DataAccessException時有不同的策略。要聲明或不聲明DAO接口方法中的DataAccessException?

有些人明確聲明它和一些不(或僅有不定期):

public interface FlightDao { 

    boolean decrementSeat(Long flightId, int quantity); 

    List<Flight> findFlights(String fromAirportCode, String toAirportCode) throws DataAccessException; 

    public List<Flight> getFlights(); 

    Flight getFlight(Long id); 

    Flight getFlight(String flightNumber); 

    void save(Flight flight); 

} 

什麼會被認爲是最好的做法,爲什麼?

更新

spring tutorial第13.2.2,它與註釋的@Repository實現DAO POJO,以確保底層ORM(或JDBC)異常自動翻譯成的DataAccessException(很重要運行時)異常層次。

回答

2

正如你可以看到here,這是一個RuntimeException,所以你聲明它或不在編程方面沒有什麼區別。當用戶實現該方法時,他可以選擇從方法簽名中省略此異常。

我認爲把它放在方法簽名中的唯一原因是爲了標記它,所以用戶會知道這個方法可能拋出這個異常,因此他可以選擇它來捕捉它並處理它。

1

如果在查找航班/獲取航班/遞減座位時出現任何異常情況,調用這些「服務」方法的應用程序在處理這些異常時應該有最終決定權。 FlightDAO作爲服務應該簡單地捕獲並拋出所有異常。您可能會發現創建一個新的用戶定義的異常是很有用的......將其稱爲ServiceException或MyDAOException,並使FlightDAO中的所有方法引發此用戶定義的異常。

+0

我不太確定這個策略,因爲通過讓這些運行時異常爬上堆棧,Spring會在事務級別捕獲它們(如果有的話),這將觸發回滾。 – JVerstry 2012-07-10 11:46:48

+0

是的。如果彈簧容器是插入操作並且存在異常,則它應該回滾。但我仍然認爲向調用者拋出異常是至關重要的。如果您試圖說getFlights並且存在運行時異常,那麼調用此服務的應用程序會發現知道該列表是否有空是因爲出現異常而導致該列表爲空,而不是因爲該查詢沒有航班。 – rprab 2012-07-10 19:34:08