首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

在 ApacheDS 中存儲 Java 對象(下):搜索、反序列化、更新與統一封裝

     編輯:Java 相關知識

ApacheDS Java 對象全生命週期操作實戰(續)

接續上篇(存儲篇),本文深入講解搜索、反序列化、編組對象解編、更新及統一封裝類 LDAP4JavaObjects 的實現。

應用 4:基礎搜索 - 通過 UID 查找用戶 Alice

關鍵步驟:

  1. 構建搜索屬性:uid=Alice + objectClass=person
  2. 縮小搜索上下文:ou=users(而非根 ou=system)
  3. 調用 DirContext.search(context, attrs) 返回 NamingEnumeration
  4. 迭代 SearchResult,獲取 RDN (getName()) 與屬性集 (getAttributes())

注意:JNDI 搜索參數中 uid 被視為屬性處理,實際為 RDN 組件。

應用 5:按 CN (常用名) 搜索

將搜索屬性從 uid 改為 cn。關鍵點:cn 屬性定義了 SUBSTR 匹配規則 caseIgnoreMatch,支援不區分大小寫的子串匹配。搜 "alice" 會匹配 "Alice Smith"、"Bob Alice" 等。

應用 6:反序列化 Java 對象 (序列化形式)

需在用戶條目子樹中查找 MessagingPreferences 對象:

  1. 先搜索用戶獲取 RDN (uid=alice,ou=users)
  2. 構建新搜索上下文:uid=alice,ou=users,ou=system
  3. 創建 SearchControls:setReturningObjFlag(true) + SUBTREE_SCOPE
  4. 過濾器:(|(javaClassName=MessagingPreferences)(javaClassName=ShippingPreferences))
  5. 調用三參數 search(ctx, filter, ctls)
  6. 獲取對象:SearchResult.getObject() → 類型檢查轉換

應用 7:解編編組對象 (MarshalledObject)

與應用 6 流程相同,區別在:

  • 過濾器:(javaClassName=java.rmi.MarshalledObject)
  • 獲取對象後:MarshalledObject.get() 獲得真實 Java 對象 → 再次類型檢查轉換

應用 8:編輯並更新存儲對象

// 1. 搜索獲取對象 (同應用 7)
MarshalledObject mObj = (MarshalledObject) sr1.getObject();
MessagingPreferences pref = (MessagingPreferences) mObj.get();

// 2. 修改業務數據
pref.setStyles("https://www.mystyles.com/preferences");

// 3. 關鍵:保留原屬性集合
Attributes attrs1 = sr1.getAttributes();

// 4. 重新綁定 (rebind 覆蓋現有條目)
String bindContext = entryRDN + "," + searchContext; // 完整 DN
ctx.rebind(bindContext, pref, attrs1);

rebind vs bind:rebind 會覆蓋同名條目,bind 衝突則拋異常。

應用 9:統一封裝類 LDAP4JavaObjects

整合存儲、搜索、更新、刪除核心邏輯,提供智能 writeToServer():

  • 檢查用戶條目是否存在 → 不存在則創建 (bind),存在則更新 (rebind)
  • 檢查 Java 對象子條目是否存在 → 決定 bind/rebind
  • 封裝 JNDI 底層邏輯為 protected 方法,支援子類擴展業務邏輯
  • 提供 searchFromServer() 統一搜索入口,自動填充對象狀態

核心類結構速覽

public class LDAP4JavaObjects {
    // 配置屬性
    protected String userID, commonName, javaObjectCN, initialContext;
    protected Properties properties;
    protected DirContext dirContext;
    protected Object javaObject;
    protected Attributes attributes;

    // 核心操作
    public void writeToServer();      // 智能存儲/更新
    public void searchFromServer(String user, String object);
    protected void store(...);        // bind 新條目
    protected void update(...);       // rebind 更新
    protected NamingEnumeration search(...); // 統一搜索邏輯
    // ... setter/getter 輔助方法
}

使用示例

LDAP4JavaObjects client = new LDAP4JavaObjects();
client.setPassword("secret");
client.setUserID("Alice");
client.setJavaObject(new MessagingPreferences());
client.setJavaObjectCN("preferences");
client.writeToServer();  // 自動判斷新增/更新
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved