2015-07-09 30 views
1

正如標題所說,我有這樣一些庫:當找不到User時,應該從Spring @Service返回什麼?

public UserRepository{ 
    public Optional<User> findByUsername(String username){..logic..} 
} 

和服務:

public UserService { 
    @Autowired 
    private UserRepository userRepository; 

    public Optional<User> findByUsername(String username){ ..calling repository.. } 
} 

在我@Controller類我想從UserService獲得用戶實例

但我不知道應該從@Service返回什麼 - 可選,並檢查它是否isPresent()內部控制器,或者只是簡單的空?我很困惑。

我試圖將如此多的邏輯移動到@Service層,因爲我可以,所以檢查可選似乎不是一個好主意。

謝謝!

回答

1

理想情況下,你應該做的就是拋出異常。這是這樣做的最佳做法。然而,如果你願意的話,你也可以堅持使用null,但是例外清楚地說明了問題的原因,並且在後期階段是非常可維護和可分發的。

你可能會喜歡做這樣的事情

findByUsername(String username){ 

    // find user 
if(user !=null){ 
    return User 
} 
else 
    throw new UserNotFoundException(); 


} 

請點擊此鏈接瞭解如何創建自定義異常。 http://techekiras.blogspot.in/2015/02/how-to-create-custom-exception-in-java.html

這對於如何處理這些 http://www.ekiras.com/2015/02/how-to-create-nested-custom-exceptions-in-java.html

捕捉控制器上這些異常採取進一步的行動。

+0

您粘貼2個相同的鏈接;)我想過拋異常,我在我的RESTful應用程序是如何做到的,但我聽說過將例外情況降至最低是很好的做法。所以如果有可能避免一個,那麼它應該是。 從哪一層你會拋出異常?我認爲它應該在服務層上執行,以避免將「buissnes邏輯」推入控制器中,您認爲如何? – azalut

+0

井例外是一項沉重的任務,因爲它包含完整的堆棧跟蹤,理想情況下所有異常都應該在服務中捕獲,但最終取決於您,您的項目體系結構是什麼套件。我選擇返回空值的異常,因爲你總是知道周圍發生了什麼,假設你創建一個更新方法,根據是否更新行來返回true或false。如果用戶沒有找到,你可以拋出異常,這些可以在很多地方重用。 –

0

在Java 8中有一種新的可能性。使服務返回Optional。這是在簽名中明確指出它可能返回null的一種好方法。你將被迫檢查它是否爲空,但可以是非常有益的,以avoid the famous NullPointerException

import java.util.Optional; 

[...] 

public Optional<User> getUser(String userName){ 

    User user = userDAO.getByUsername(username); 
    return Optional.of(user); 
} 
相關問題