Spring-data JPA 搭配 Optional 的使用

Optional

Java 最大的敵人, 我想應該就是 NPT Exception, tears.
所以 Java8 設計了一個 Optional 用來解決 NPT 這淘氣的小東西, fuck.
詳細的使用方式

參閱這個 bloger 的介紹, 寫的超棒, 我覺得啦 :)


JpaRepository

Spring framework 做 CRUD 的好朋友, 就是 JpaRepository,
沒有用 Optional 的寫法像這樣


@Repository
public interface UserInfoRepository extends JpaRepository<UserInfo, String> {

    UserInfo findByName(String name);
}

這樣寫其實也沒什麼不合理, 只是在商業邏輯處理時, 要多一個 if 判斷,
判斷是否有查詢到 userInfo 的資料.


public void business() {

    UserInfo user = userInfoRepository.findByName("dumdum");

    if (Objects.isNull(user)) {
        // throw exception

    } else {
        // do something
    }

}

改為用 Optional 試試看


@Repository
public interface UserInfoRepository extends JpaRepository<UserInfo, String> {

    Optional<Userinfo> findByName(String name);
}


public void business() {

    Optional<Userinfo> userOpt = userInfoRepository.findByName("dumdum");
    UserInfo user = userOpt.orElseThrow(() ->
            new Exception("查無 userInfo(dumdum) 資訊."));

    // do something

}

這樣寫感覺好多了, 另一方面也可以清楚的明白 Exception 是什麼原因產生的

找不到 user 還可以替換為預設 user, 這樣就不用處理 Exception,
當然並不是所有的情境都可以預設一個 instance.


public void business() {

    Optional<Userinfo> userOpt = userInfoRepository.findByName("dumdum");
    UserInfo user = userOpt.orElse(new UserInfo("預設 user")));

    // do something

}

沒有留言:

張貼留言