搜尋

搜尋結果

Spring boot web api 異常處理
科技新知
MacauYeah・2025-10-28

我們在編寫程式時,經常會遇到一些極端的情況,不會經過 function 的方式回傳結果。例如一個 function 原本是提供讀檔功能,但用戶傳入的並不是一個有效的檔案路徑,又或是誰路徑權限不足,無法讀取。這些不正常的結果,並不是原本 function 所協定的回傳值。那麼,我們會拋出異常 Exception ,中斷所有被呼叫中的 function ,讓上層用戶去考慮怎樣處理這個問題。 在 Web API 中,這些 Exception 就更常見。要求用戶傳入的參數,用戶就是有時候少了幾個。覆寫資料的時候,原本的資料已被刪除。但我們現在是經過 Web Api,不能像過去一直向上拋出異常就能通知用戶。我們需要的,是把異常轉成對應的 Http Status Code,讓用戶端可以快速識別異常的類型。 java 異常對應 Http Response Code 其實在 spring boot web 中,要做轉譯,是很簡單的。在定義 java Exception的時候,若有@ResponseStatus,spring boot web 就會自動回應對應的 http error code。 @ResponseStatusHttpStatus.FORBIDDEN public class CustomAuthenticationException extends RuntimeException public CustomAuthenticationException public CustomAuthenticationExceptionString message supermessage; 以後,任何一個地方拋出 CustomAuthenticationException (假設上層沒有人攔截)都會把該 Controller 的結果改為 http 403。Spring boot 也很聰明的,把異常中的 message 隱藏 ,免得有網安的問題。 若我們定義 Exception 時,沒有@ResponseStatus,Controller 就會變成 http 500,例如我在 controller 中拋個常見的 IOException,這次的結果就會變成 http 500。 @GetMappingquot;apiioErrorquot; public String forceIOException throws IOException throw new IOExceptionquot;force io errorquot;; 如果某些時候,我們想使用 java Exception 中的 message 欄位作為報錯信息,讓 http 客戶端,可以通過固定的 message 檔位找到問題訊息,我們可以在application.properties中,加入server.error.includemessage=always。有些特殊情況,在開發模式時 mvn springbootrun ,已經可以見到有 Exception message,但在投産後java jar又看不到。主要因為開發模式中, pom 有 optional springbootdevtools,會自動加入了server.error.includemessage=always,但 mvn package 後就沒有,因為 runtime 沒有 springbootdevtools 的覆蓋。 額外處理 異常處理除了想控制 http status code 外,有時還需要做一些額外處理,例如發出通知郵件等。若想做額外處理,需要另做一個 @RestControllerAdvice 的類,在接到指定的 exception 時,可以轉換不同的 http code ,而且還可以執行額外 java code ,改變 http ResponseBody 。 @RestControllerAdvice public class GlobalExceptionHandler @ExceptionHandlervalue = RuntimeException.class @ResponseStatusHttpStatus.INTERNAL_SERVER_ERROR public Map handleRuntimeExceptionException ex return Map.ofquot;retquot;, false, quot;anyfieldsquot;, ex.getMessage; 但要注意,一旦使用@RestControllerAdvice 後,就要考慮有沒有改變了某些預設的行為。例如上述的@ExceptionHandlervalue = RuntimeException.class,代表所有RuntimException.class的子類,都會歸由該 function 所處理。當然,你也可以多加幾個 function 來處理不同的子類。 Reference springbootwebapivalidate

升級 Spring Boot WebClient SSL (Reactor Netty 1.2.6):重新配置 SSL 設定
科技新知
MacauYeah・2025-08-27

因為SSL provider 更新了的關係,好多 HttpClient WebClient 設定SSL的部份都要重寫以免出現 deprecated 問題 reactor.netty.http.client.HttpClient 在 1.0.x, 中可以這樣自行設定SSL逾時的部份,但當中的spec.sslContext.defaultConfiguration 在新版本,例如1.1.x後就會出現 deprecated。 deprecated version HttpClient.create .securespec gt; spec.sslContextSslContextBuilder.forClient .defaultConfigurationSslProvider.DefaultConfigurationType.TCP .handshakeTimeoutDuration.ofSeconds30 .closeNotifyFlushTimeoutDuration.ofSeconds10 .closeNotifyReadTimeoutDuration.ofSeconds10; 觀看各大網站,都未有更新,唯有自行研究官方說明。 筆者撰寫本文的時候,netty 發行版本為 1.2.6, 1.3.0 還里程碑M6的階段。所有參考皆來自1.2.6版本,實際上我們要使用新的後綴為ContextSpec類,看Class名應該有分http 1.1, 2, 3的版本,筆者就試用最基本的http 1.1。Http11SslContextSpec, 有條件的朋友可以試用Http2SslContextSpec, Http3SslContextSpec import reactor.netty.http.Http11SslContextSpec; import reactor.netty.http.client.HttpClient; import java.time.Duration; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.http.client.reactive.ReactorClientHttpConnector; ... Http11SslContextSpec http11SslContextSpec = Http11SslContextSpec.forClient; HttpClient httpClient = HttpClient.create .securespec gt; spec.sslContexthttp11SslContextSpec .handshakeTimeoutDuration.ofSeconds30 .closeNotifyFlushTimeoutDuration.ofSeconds10 .closeNotifyReadTimeoutDuration.ofSeconds10; WebClient webClient = WebClient.builder.clientConnectornew ReactorClientHttpConnectorhttpClient .build; ... 雖然這個寫法來看netty 1.2.6,但似乎1.1.x 通用。大家有需要可以交互測試一下。 Reference netty 1.2.6 httpclienttimeout 的設定 netty 1.1.30 timeoutconfiguration 的設定 netty 1.2.6 java api doc netty release version 更多筆者的程式開發分享,見請 github

Swarm mode 上線 4 | IP 設定
科技新知
MacauYeah・2024-07-23

單機模式 IP設定 平常我們自己做測試,網絡功能通常用預設的就好。但當我們的Docker Container需要存取在區域網內的其他資源,避晚IP網段相衝是必需要的事。 大部份情況下,單機Docker使用的預設IP段會是 172.17.0.016 172.18.0.016 ... 若然現在區域網中,有一段172.18.0.024,大家不想Docker踩到其中,可以修改設定檔,加入預設的defaultaddresspools,以後它就只會從指定的區段使用。 # vim etcdockerdaemon.json quot;defaultaddresspoolsquot; quot;basequot; quot;172.17.0.016quot;, quot;sizequot; 24 , quot;basequot; quot;172.19.0.016quot;, quot;sizequot; 24 , quot;basequot; quot;172.20.0.016quot;, quot;sizequot; 24 其中base,是docker可以操作的總區域,size指的是Docker要自行分段的話,每段的大小是多少,上述的例子,就代表未來可能有以下Docker 網段。 172.17.0.024 172.17.1.024 ... 172.17.255.024 172.19.0.024 172.19.1.024 ... 172.19.255.024 172.20.0.024 172.20.1.024 ... 172.20.255.024 修改完設定後,重啟Docker就會生效。當然,重啟前,先刪除所有不在預設範圍的所有Container。 Swarm模式 IP設定 Swarm模式,與單機差不多,它需要在初始化Swarm就要定義,而且它不能與單機的網段有重疊。單機會預設使用Private IPv4 Class B,Swarm則是預設使用Private IPv4 Class A段,所以我們若就更改,就使用10.x.x.x吧。 docker swarm init defaultaddrpool 10.1.0.016 defaultaddrpoolmasklength 24 經上述例子初始化的 ingress 網段,將會是 10.1.0.024,隨後每個stack 則會是 10.1.1.024 10.1.2.024 10.1.3.024 重置Swarm 跟單機的情況類似,如果已建立Swarm後才修改網段,還是要整個刪掉重來。 每個節點都要執行以下指令。 docker swarm leave force 實測swarm leave這個指令也會把所有運行中的stack刪掉。 各節點重新建立swarm # in node 1, init new swarm with new ip docker swarm init defaultaddrpool 10.1.0.016 defaultaddrpoolmasklength 24 # in node 1, get new manager token docker swarm jointoken manager # in node 2 and node 3, join node 1 with new token docker swarm join token XXXXX YOUR_NEW_NODE1_IP2377 雙管齊下 如果大家同想要修定單機及Swarm的網段,還要留意有一個特別的網段docker_gwbridge。它雖然是Swarm的附帶產物,但它則是受單機的網段控制。也就是,如果大家有需要同時修改單機及Swarm的網段,則需要手動刪除Swarm及docker_gwbridge 在每個節點先刪掉舊有的Swarm及docker_gwbridge,並關掉docker docker swarm leave force docker network rm docker_gwbridge 在每個節點為docker_gwbridge修改設定,然後重起docker # vim etcdockerdaemon.json quot;defaultaddresspoolsquot; quot;basequot; quot;172.17.0.016quot;, quot;sizequot; 24 然後像前述一樣,重起Swarm。

花,台北都有花!
旅遊情報
Cheers!・2017-03-10

陽明山今年的花季已展開,花期中將舉辦各式活動,更開設了網站提供賞花情報。(照片來源:陽明山花季官網) 去台灣賞櫻,唔係事必要上阿里山,飛台北,近近地去陽明山一樣有得睇,不妨趁周末飛一轉,影低櫻花盛開靚景。 人氣賞櫻熱點 台灣於日治時期曾廣泛種植櫻花,陽明山是日本最早在台灣種植櫻花的地區,所以一直是台北人氣賞櫻熱點。此處的櫻花較其他賞花勝地密集,品種亦較多。除了原生的台灣山櫻,即緋寒櫻之外,還有昭和櫻、八重櫻及吉野櫻等,後者更是日本常見的品種。而且不同品種的開花時間有先有後,遊客在花季中的不同日子山,都有機會欣賞到櫻花靚景。 陽明山的櫻花以山櫻佔多,有點熟口熟面?其實二龍喉公園和石排灣馬路的櫻花樹也屬同一品種。(照片提供:絹絲谷森林渡假村) 櫻花盛開 今年冬天特別暖,櫻花沒有經過寒冷期,在暖笠笠的天氣下開得較往年慢,足足遲了半個月才到盛開期,不過要有心理準備每逢花季會遇上大批賞花人潮,而且上山道路亦會實施交通管制,最好乘搭公共交通工具前往;如計劃自駕遊,出發前亦要預先上網Check下封路及改道安排。 陽明山上的山櫻一般在農曆年前已見開花,今年因受暖冬影響延遲盛開。(照片提供:絹絲谷森林渡假村) 新增夜櫻 上陽明山賞櫻,最方便直接就是去陽明公園,單是公園範圍內已有千多棵不同品種的櫻花,花鐘廣場及前山公園一帶更屬最佳賞花地點。陽明公園剛完成更新工程,在著名的花鐘地標前,增設了櫻花林溪流區,櫻花盛開的日子,定必引來花迷朝聖。陽明公園今年亦首次在噴水池及陽明銅像附近新設「賞夜櫻區」,每晚6時至9時亮燈,特別的照明效果,令櫻花靚得來帶上點點神秘感,想影夜櫻就要帶定適合的攝影器材。此外,花季期間陽明山會舉行不少官方活動,包括花見野餐、嘉年華及導賞團等,活動大多名額有限,有興趣參與的話,最好盡快上官網睇詳情再順手報名。 花鐘廣場旁有近60棵八重櫻,公園翻新後更在此增設櫻花林溪流區,是櫻迷必到的打卡地點。(攝影:Bernard Gagnon) 花鐘旁的噴水池附近亦新設「賞夜櫻區」,櫻花、夜色加燈效,一個字:靚!(攝影:Mike841125) 陽明公園櫻花分佈 花種 地點 數量 山櫻花 陽明公園 456棵 八重櫻 陽明公園花鐘廣場、蔣公銅像 59棵 第二停車場水濂洞區 98棵 昭和櫻 陽明公園噴水池 218棵 吉野櫻 陽明公園 44棵 陽明公園前綠地 47棵 湖山綠地 300棵 資料來源:陽明山花季官網 陽明山花季 網址:2017.yms.taipei 櫻花主題產品,必掃! 咪以為只有日、韓Starbucks先有限定版櫻花產品,今年台灣也有,而且靚到一絕,見到立即心心眼。想據為己有?去開台北賞花不妨碰碰運氣,也可以預先上博客來網站訂好送往酒店,手快有手慢冇! 不同產品於網上將分階段發售,手快都唔包保買到心頭好。(照片來源:博客來網站) 博客來 網址:www.books.com.twwebstarbucks 下一站,海芋! 陽明山賞櫻固然是大熱,但近年賞花團異軍突起,掀起一片海芋熱潮。在陽明山上海拔670公尺高的竹子湖一帶,就有許多海芋花田,台灣的海芋,就是馬蹄蘭,花期由每年3月中旬開始,直至4月下旬。假如趕不及櫻花的花期,一於在3、4月去睇睇生長在青翠山林間的雪白海芋! 竹子湖有不少海芋觀光農園開放,賞花之餘也可以試試摘海芋。(攝影:盧峰) 享用貴賓候機室 如果你係CTM Visa Signature信用卡客戶,今年內可以全年無限次免費享用全球Priority Pass同指定環亞機場貴賓候機室服務,飛台北時記得入貴賓候機室休息下食下嘢喇! 靚靚花相即時Share 影完靚花靚景要即時開心Share,又點少得CTM「數據漫遊護照(1日)」服務?而家透過CTM積分獎賞計劃憑1,000積分再加$48,即可換領一日無限數據服務,不過要記得在使用服務前最少兩個工作日前申請,快快下載CTM Buddy手機程式換購啦!

海事博物館,走上一趟,宛如上了一堂曆史課!
其他
澳門生活圈・2019-09-19

同步發布媒體公眾號 媒體排名不分先後 澳門海事博物館 澳門海事博物館1987年建成,現在展覽大樓在1990年開始正式啟用。 海事博物館的主題不但反映了澳門曆史與大海之間的密切聯系,還有系統地闡述了中國和葡萄牙在海事方面的曆史,說明了大海對人類及文化所具有的重要性。 博物館就像一艘揚著白帆的三桅船,停泊在媽閣廟前。地下的展廳主要介紹中國南部及澳門漁民的生活情況。 展品包括:各種中式帆船、內港魚欄、說明各種捕魚的方法等等┅┅ 在這一層,無論大人還是小孩都會被ldquo;媽閣廟的故事rdquo;這個活動舞台吸引,它把媽祖保護人們安全到達濠鏡海港的美麗傳說生動地呈現在觀眾的眼前。 同時,備有葡語、國語、粵語和英語的旁白供選擇。地下和一樓之間的0陳列了十來艘葡國傳統船只的模型。 在模型上面有一個熒幕,介紹各種船只的來源和用途。此外,還有兩艘宏偉的船只模型薩格雷斯號和克雷奧拉號。  一樓展覽廳,讓人仿佛置身在航船的甲板上。而博物館頂樓的展品與航海技術及海上交通工具有關。 此外,還有電子天氣指南,提供每日天氣及空氣質量的資料。  這裏還有聚集著色彩斑斕的海洋魚類和種類繁多的貝殼的水族館。 另外,即使不會遊泳,也可以進入深海探秘,只要進入位於露天茶座內之ldquo;海底漫遊rdquo;模擬器,便可進入一個驚險刺激之深海旅程。   這個建於1966年,為路環九澳居民、包括痊愈的麻瘋病人及一些新患者而設,教堂的北門上有一個壯觀的青銅十字架是由意大利雕刻家方濟各美斯馬為九澳居民鑄造,意大利雕刻家西奧夏江治亦曾參與建築這座教堂。

母親節饗宴傳遞暖暖心意
澳城餐飲
LifeMag Editor・2016-04-29

今個母親節,澳門皇都酒店的梓園上海菜館和花道葡萄牙餐廳為盡表孝心的您準備各款美食,一系列寵幸母親的特色中、葡美味佳餚任您選擇。只要由即日起至5月4日期間,預訂並交付訂金,即可在母親節活動期間 5月5日至8日 享受眾多優惠折扣,讓您與母親、家人共享溫馨天倫之樂。 花道餐廳將在整個五月推出葡萄牙特色品酒套餐,五款佳餚搭配五款佳釀,原價每位澳門幣680元,現在提前預訂,便可於母親節活動期間享受每位只需澳門幣580元的特別優惠。其中包括主廚特製的鴛鴦汁馬介休慕斯伴番茄,搭配2010年的 Monte da Casta, Tejo Branco,巧妙搭配讓各位母親胃口大開;八爪魚燉飯配西班牙火腿及香蕉,造型討喜味道更是讚不絕口,配上2014年Herdade do Esporatilde;o Reserva, Alentejo Branco,定能令各位母親一試難忘;來自葡萄牙的阿連特茹豬頰肉配蘑菇煨麵包,搭配2008年Quinta de la Rosa Reserva, Douro Tinto,傳統風味的葡式料理配上葡國美酒絕對能讓您仿如置身於ldquo;海角酒國rdquo;中;特色甜品芝士布丁配焦糖蘋果及榛子碎,配上Borges Tawny Port,必令每位母親甜蜜在心頭。 梓園上海菜館也為您奉上暖暖的孝心,傳統而精緻的菜式,定會為您及您的母親大飽口福。母親節特別推出各式精選套餐:四人套餐$1630、六人套餐$2500、八人套餐$3380及十人套餐$6500。當中包括多款傳統名貴的上海菜如乾燒大明蝦、原盅雞燉翅、血糯八寶飯等等。除精選套餐外,更為您特別定制心儀菜單。只要現在提前預定,均可在活動期間享受8折優惠。 今年母親節活動期間,梓園及花道餐廳還亦貼心地為各位母親準備了一份極富意義的神秘禮物,孝心的您一個小小舉動即可為媽媽和社會送上一份感動,千萬別錯過!以上各款優惠,只需您在即日起至5月4日期間提前預訂並交付訂金,便可在母親節活動期間享有,趕快為您的母親策劃一個溫馨的驚喜吧!查詢及訂座,請致電(853)2855 2222,花道內線142,梓園內線189。 更多資訊、優惠及推廣活動,請密切留意澳門皇都酒店Facebook專頁。httpswww.facebook.comhotelroyalmo 搜尋WeChat帳號:'macauhotelroyal' 隨時隨地收取澳門皇都酒店的最新消息!