跳到主要內容

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

}

留言

這個網誌中的熱門文章

Parse URI query string to Key Value

Parse URI query String to Map 做 urlDecode 處理 沒有任何 query String 回傳 Empty Map 確保只處理 key-value 結構的 query String package com.example.util; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.utils.URIBuilder; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URLDecoder; import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; /** * Created by jerry on 2017/12/28. * * @author jerry */ @Slf4j public class UriUtil { private UriUtil() { } public static Map splitQuery(final String uri) { Map queryPairs = new LinkedHashMap (); try { final URI uri = new URIBuilder(uri).build(); final String rawQuery = uri.getRawQuery(); log.info("CurrentUrl Query: {}", rawQuery); // 過濾沒有 query string // 還有過濾無法成對 keyValue 的 query, e.g. http://host/path?123 if (Objects.isNull(rawQuery) |...

Google Compute Engine‎ - AccessDeniedExceptions 403

原因 打算從 instance 打包 logs 到 google cloud storage 發生了 AccessDeniedException: 403 Insufficient OAuth2 scope to perform this operation. , 看起來是 instance 沒有 storage 權限 解決 Reference: https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes 重新設定 service account 權限 instance 上內建有 gcloud , 就直接用現有的工具查詢一下 instance 的 account. $ gsutil info 或者在本機直接 gcloud compute instances describe INSTANCE_NAMES Account: [alpha-number-compute@developer.gserviceaccount.com] Project: [our-project-name] 會看到 instance 的一些狀態, 接下來就簡單多了, 按照下列的說明, 要先 stop instance, 更改 storage scope 再重新 start 。 To change an instance's service account and access scopes, the instance must be temporarily stopped. To stop your instance, read the documentation for Stopping an instance. After changing the service account or access scopes, remember to restart the instance. # Stop Instance gcloud compute instances stop INSTANCE_NAMES # 設定 storage scope 為 full (Read, Write) gcloud co...

Spring-boot Thymeleaf Html5 SAXParseException 解析錯誤

thymeleaf 解析 html5 出錯 <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="description" content=""> <meta name="author" content=""> <title>SB Admin - Start Bootstrap Template</title> <!-- Bootstrap core CSS--> <link href="../static/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <!-- Custom fonts for this template--> <link href="../static/vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css"> <!-- Page level plugin CSS--> <link href="../static/vendor/datatables/dataTables.bootstrap4.css" rel="stylesheet"> <!-- Custom styles for this template--> <li...