#Java
標記為 #Java · 13 篇文章
- Java 端的 DXL:DxlExporter/DxlImporter 怎麼把 Domino 資料進出 XML
要把設計元素在資料庫之間搬、或把文件快照成 XML 做 diff/備份,DXL 就是 Domino 的 XML 表示法。在 Java 裡兩個主力是 DxlExporter(Domino→DXL,exportDxl 回一個 String)與 DxlImporter(DXL→Domino,importDxl 寫進目標 DB)。重點是:import 不是「把 XML 灌進去」這麼單純——你要用 setDesignImportOption/setDocumentImportOption/setAclImportOption 告訴它 design、文件、ACL 各自要 create/replace/update 還是 ignore,還有 replica 要不要相符。這篇整理兩個類別的建立與方法、import 的策略選項,以及跟 LotusScript 版的關係。
2026.10.04 - XPages managed bean:給 SSJS 一個真正的 Java 物件,像 database 一樣直接用
SSJS 寫在 script library 裡當膠水很方便,但邏輯一多就難維護——沒有真正的型別、難測試、塞進 scope 還有序列化問題。managed bean 讓你在 faces-config.xml 宣告一個 Java class,它就變成 SSJS 與 EL 裡的一個頂層變數,用起來跟 database、session 一樣——bean.method()、#{bean.prop}。這篇講 managed bean 怎麼宣告(name/class/scope 三元素)、class 的三個要件(no-arg 建構子、get/set、Serializable)、scope 的生命週期,以及邏輯什麼時候該從 SSJS 搬進 bean。
2026.10.03 - NotesThread:在 Domino 開背景執行緒的規矩——每條 thread 要 init、要自己的 session
在 Java 裡想開一條背景執行緒去跑 Domino 的 local 呼叫,直接 new Thread 是不行的——會拿不到 Notes 執行環境。要嘛繼承 NotesThread 覆寫 runNotes()、要嘛實作 Runnable 交給 NotesThread、要嘛自己在頭尾呼叫 sinitThread()/stermThread()。而且每條 thread 要有自己的 Session、自己 recycle,不能跨執行緒共用。這篇整理 NotesThread 的三種寫法、sinitThread/stermThread 的配對規則、每執行緒一個 session 的鐵律,以及背景執行緒裡拿不到 sessionAsSigner 的現實。
2026.09.30 - Domino IQ 逾時的 Java 解法:LLMReq.completionStream,以及 XPages SSJS 怎麼調用它
昨天那篇用 LotusScript 的 CompletionStream 突破了 Domino IQ 的 5 分鐘逾時;如果你的程式是 Java(agent、bean)或 XPages(SSJS),撞到的是同一個逾時。這篇給 Java 版:LLMReq.completionStream 搭配 CompletionStreamCallback 介面(回傳 Continue/Stop 控制串流),以及一個關鍵事實——SSJS 沒有原生的 LLM class,但 SSJS 的 session 就是 lotus.domino.Session,所以你可以直接調用 Java API,或把串流包成 Java class 再從 SSJS 引用。附三種語言一張對照表。
2026.09.06 - Java 的 NotesException:.id、.text 與 try/catch/finally
LotusScript 的錯誤處理是 On Error Goto、Err.Number、Resume 那一套。搬到 Java,幾乎每個 lotus.domino 方法都會丟一個受檢的 NotesException——編譯器逼你處理,而它身上帶著 .id(Notes 錯誤碼)與 .text(錯誤訊息)。這篇講 Java 版的例外處理:NotesException 的欄位、怎麼用 .id 比對 NotesError 常數做針對性處理,以及把這整個 Java 資料層系列收在一起的那條規則——recycle 要放進 finally,這樣連拋例外時也收得乾淨。
2026.08.17 - 在 Java 裡迴圈跑 DocumentCollection:先拿下一份,再 recycle 這一份
LotusScript 裡跑一個 DocumentCollection,你 Set doc = coll.GetNextDocument(doc) 一路跑到底,從不想記憶體的事。搬到 Java,同一個迴圈跑上萬份文件會把 agent 記憶體吃垮——除非你在迴圈裡 recycle 每一份,而且順序不能錯:得先用當前這份拿到下一份、再 recycle 當前這份。這篇講 Java 版的正確迭代寫法:DocumentCollection 的 getFirstDocument/getNextDocument、刪除標記的 isValid、什麼時候該改用更省的 ViewNavigator,以及那個 LotusScript 從不需要煩惱的 recycle 順序。
2026.08.16 - 在 Java 裡處理 Notes 日期,為什麼不能直接用 java.util.Date?
在 Java 裡處理 Notes 的日期,你不能直接用 java.util.Date——中間隔著一個 lotus.domino.DateTime。它是個背後連著 handle 的重量級後端物件,在迴圈裡不 recycle 就漏記憶體;它用字串在存日期、壞值會丟例外;而 toJavaDate() 是你把它換成 Java 自家時間型別、再接上 java.time 的那座橋。這篇講 Java 版 DateTime 怎麼建、怎麼讀寫、怎麼跟 Java 的時間世界互轉,以及那個從 LotusScript 帶不過來的 recycle 負擔。
2026.08.15 - Java 讀寫 Notes item:getItemValue 回的是 Vector,不是你熟的那種陣列
LotusScript 裡 doc.GetItemValue 回一個 Variant 陣列,你 For 一圈就完事。搬到 Java,同一個呼叫回的是 java.util.Vector,元素型別要自己認、缺欄位不丟例外只回空的、裡面若是 DateTime 還會漏記憶體。這篇把 Java 版 Document 的讀寫 item 講清楚:getItemValue 與那幾個型別化 getter 的回傳與缺欄位行為、replaceItemValue 接受哪些 Java 型別又會自動建 item、appendItemValue 為什麼會默默建出重複 item,以及三個 LotusScript 帶不過來的雷。
2026.08.14 - Java agent 的骨架:觸發、權限、輸出、除錯
前三篇都假設「agent 已經在跑」——會 recycle、拿到 Session、跑 DQL。但一個 Java agent 到底怎麼被觸發、用誰的權限執行、System.out 跑去哪、怎麼 debug?這篇補上最前面那一步:AgentBase/NotesMain 骨架、Trigger 與 unprocessedDocuments、agent signer 決定的權限、restricted/unrestricted,以及 System.out 進 log.nsf 的除錯路徑。
2026.08.10 - 在 Java 裡跑 DQL:DominoQuery 與 QueryResultsProcessor
站上的 DQL 三部曲教你寫查詢,但那是從 LotusScript 或 console 跑的。搬到 Java,DQL 走兩個類別:DominoQuery 負責編譯、調校、執行,QueryResultsProcessor 負責排序、彙總、跨庫 join、輸出 JSON。還有一個容易錯的地方——這兩個都從 Database 取得,不是 Session。這篇拆解 Java 端怎麼把 DQL 跑起來。
2026.08.09 - 在 Java 裡拿到 Session:NotesFactory、local 與遠端
LotusScript 的 session 是個你從來不必建立的全域變數;Java 沒有它。碰任何一份文件之前,你得自己先取得一個 Session——而怎麼拿,取決於你的 code 跑在 agent、獨立程式,還是遠端。這篇拆解 NotesFactory 的三條取得路徑、local(JNI) 與遠端(DIIOP) 的差別、誰建誰收的 recycle 規則,以及位元數與每執行緒一個 session 這兩個常見地雷。
2026.08.08 - LotusScript 改寫 Java 後記憶體爆掉?你可能忘了 recycle()
同一段邏輯,LotusScript 跑一輩子都沒事,搬到 Java 版的 lotus.domino 卻會在幾萬份文件的迴圈裡把 agent 記憶體吃垮。原因是每個 Java 物件背後都連著一個垃圾回收看不到的後端 handle。這篇拆解機制、四條官方規則、迴圈洩漏樣式與安全寫法、NotesThread 的角色,以及 local 與遠端 session 的差異。
2026.08.07 - NSF ODP Tooling:不開 Designer,把 NSF 變成可版控的原始碼
NSF ODP Tooling 是 OpenNTF 的專案,把二進位的 NSF 拆成檔案系統上的 On-Disk Project(ODP),讓你能把 Domino 應用放進 Git,再不靠 Domino Designer 就把 ODP 編譯回完整的 NSF —— 為 Domino 帶來真正的版本控制與 CI/CD。本文完整介紹它是什麼、Maven plugin 與容器化編譯怎麼運作,以及 4.1.0 這一版實際改了什麼。
2026.06.27