1. 程式人生 > >使用 Spring LDAP 讀取資料並對映到 Java Bean 中

使用 Spring LDAP 讀取資料並對映到 Java Bean 中

[i]寫此小文總結一下平時工作的收穫。[/i]

入正題,工作涉及到了對 LDAP 的 CRUD 操作,不忍同事用 JLDAP 寫的冗長程式碼(主要並不是 JLDAP 的錯。冗長程式碼問題可以通過程式碼重構和 Java 反射去解決)。後發現 Spring LDAP 是用來寫 LDAP 相關程式的一個不錯的選擇之一(並沒有深入瞭解別的框架)。直接上程式碼,希望能給同樣需要操作 LDAP 的朋友一些幫助:


LdapTemplate ldapTemplate = buildLdapTemplate();

AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("oacAttrMsisdn", "1"));
filter.and(new EqualsFilter("oacAttrCategory", "UserProfileRule"));

List list = ldapTemplate.search("oacAttrCategory=UserProfileRule",
filter.encode(), new BeanAttributesMapper(new UserProfileRule()));

private static LdapTemplate buildLdapTemplate() throws Exception {
LdapContextSource contextSource = new LdapContextSource();
contextSource.setUrl("ldap://localhost:389");
contextSource.setBase("dc=example,dc=com");
contextSource.setUserDn("cn=Directory Manage");
contextSource.setPassword("ds");
contextSource.afterPropertiesSet();

LdapTemplate ldapTemplate = new LdapTemplate();
ldapTemplate.setContextSource(contextSource);
return ldapTemplate;
}

public class BeanAttributesMapper implements AttributesMapper {
private List<String> skipAttrs;

private Object bean;

public Object mapFromAttributes(Attributes attributes)
throws NamingException {
NamingEnumeration attrEnumeration = attributes.getAll();
while (attrEnumeration.hasMore()) {
Attribute attr = (Attribute) attrEnumeration.next();
System.out.println(attr.getID() + " : " + attr.get());
String ldapAttr = attr.getID().replace("oacAttr", "");
if (!skipAttrs.contains(ldapAttr))
setProperty(bean, attr.getID().replace("oacAttr", ""),
attr.get());
}
return bean;
}

public void setProperty(Object bean, String name, Object value) {
String setterName = "set" + StringUtils.capitalize(name);
Method setter;
try {
setter = bean.getClass().getMethod(setterName, value.getClass());
setter.invoke(bean, value);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}


LDAP entry 與 Java Bean 對映的條件是 LDAP attribute name 要和 Java Bean 的屬性名之間有對映關係,在這裡就是 LDAP 屬性名除去字首就是 Java Bean 中的屬性名。Spring LDAP 文件中有專門一章是介紹 Java Bean 與 LDAP 資料間的對映,類似 ORM:http://static.springsource.org/spring-ldap/docs/1.3.x/reference/html/odm.html

BTW. 如果是個人做測試的話,OpenDS 是個不錯的 LDAP 伺服器的選擇,Apache DS 和 OpenLDAP 用起來都不太方便。