Spring-data JPA 搭配 Optional 的使用

Posted by 冬天好涼 on October 18 ,2017

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

}

沒有留言:

張貼留言