The DefaultDirObjectFactory
is registered with
the ContextSource
by default, which means that whenever
a context is found in the LDAP tree, its Attributes
and
Distinguished Name (DN) will be used to construct a
DirContextAdapter
. This enables us to use a
ContextMapper
instead of an
AttributesMapper
to transform found values:
Example 3.1. Searching using a ContextMapper
package com.example.dao; public class PersonDaoImpl implements PersonDao { ... private static class PersonContextMapper implements ContextMapper { public Object mapFromContext(Object ctx) { DirContextAdapter context = (DirContextAdapter)ctx; Person p = new Person(); p.setFullName(context.getStringAttribute("cn")); p.setLastName(context.getStringAttribute("sn")); p.setDescription(context.getStringAttribute("description")); return p; } } public Person findByPrimaryKey( String name, String company, String country) { Name dn = buildDn(name, company, country); return ldapTemplate.lookup(dn, new PersonContextMapper()); } }
The above code shows that it is possible to retrieve the attributes
directly by name, without having to go through the
Attributes
and BasicAttribute
classes. This is particularly useful when working with multi-value attributes. Extracting values from
multi-value attributes normally requires looping through a NamingEnumeration
of
attribute values returned from the Attributes
implementation. The
DirContextAdapter
can do this for you, using the getStringAttributes()
or getObjectAttributes()
methods:
Example 3.2. Getting multi-value attribute values using getStringAttributes()
private static class PersonContextMapper implements ContextMapper {
public Object mapFromContext(Object ctx) {
DirContextAdapter context = (DirContextAdapter)ctx;
Person p = new Person();
p.setFullName(context.getStringAttribute("cn"));
p.setLastName(context.getStringAttribute("sn"));
p.setDescription(context.getStringAttribute("description"));
// The roleNames property of Person is an String array
p.setRoleNames(context.getStringAttributes("roleNames"));
return p;
}
}
Spring LDAP provides an abstract base implementation of ContextMapper
,
AbstractContextMapper
. This automatically takes care of the casting of the supplied
Object
parameter to DirContexOperations
.
The PersonContextMapper
above can thus be re-written as follows:
Example 3.3. Using an AbstractContextMapper
private static class PersonContextMapper extends AbstractContextMapper { public Object doMapFromContext(DirContextOperations ctx) { Person p = new Person(); p.setFullName(context.getStringAttribute("cn")); p.setLastName(context.getStringAttribute("sn")); p.setDescription(context.getStringAttribute("description")); return p; } }