LDAP ディレクトリ内のデータにアクセスしようとしています。そのために、Spring LDAP を使用します。私は最近、DirContextAdapter とも呼ばれる魔法のような使い方があることを知りました。ただし、昔ながらの方法で問題なくレジストリを参照できた場合、この場合は NullPointerException が発生します。
ドキュメントの例に従って作成したdaoは次のとおりです。
@Component
public class DynSubscriberDao {
@Autowired
private LdapTemplate ldapTemplate;
public void create(DynSubscriber subscriber) {
DirContextAdapter context = new DirContextAdapter(buildDn(subscriber));
mapToContext(subscriber, context);
ldapTemplate.bind(context);
}
public void update(DynSubscriber subscriber) {
Name dn = buildDn(subscriber);
DirContextOperations contextOperations = ldapTemplate.lookupContext(dn);
mapToContext(subscriber, contextOperations);
ldapTemplate.modifyAttributes(contextOperations);
}
public void delete(DynSubscriber subscriber) {
ldapTemplate.unbind(buildDn(subscriber));
}
public List findByFullName(String fullName) {
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("objectclass", "DynSubscriber")).and(
new WhitespaceWildcardsFilter("cn", fullName));
return ldapTemplate.search(DistinguishedName.EMPTY_PATH,
filter.encode(), getContextMapper());
}
public List findByName(String name) {
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("objectclass", "DynSubscriber")).and(
new WhitespaceWildcardsFilter("cn", name));
return ldapTemplate.search(DistinguishedName.EMPTY_PATH,
filter.encode(), getContextMapper());
}
public List findAll() {
System.out.println(getContextMapper().toString());
EqualsFilter filter = new EqualsFilter("objectclass", "DynSubscriber");
return ldapTemplate.search(DistinguishedName.EMPTY_PATH,
filter.encode(), getContextMapper());
}
protected ContextMapper getContextMapper() {
return new DynSubscriberContextMapper();
}
protected Name buildDn(DynSubscriber subscriber) {
return buildDn(subscriber.getFullName());
}
protected Name buildDn(String fullName) {
DistinguishedName dn = new DistinguishedName();
dn.add("cn", fullName);
return dn;
}
protected void mapToContext(DynSubscriber subscriber, DirContextOperations context) {
context.setAttributeValues("objectclass", new String[] { "top", "person",
"DynSubscriber" });
context.setAttributeValue("cn", subscriber.getFullName());
}
private static class DynSubscriberContextMapper extends AbstractContextMapper {
public Object doMapFromContext(DirContextOperations context) {
DynSubscriber DynSubscriber = new DynSubscriber();
DynSubscriber.setFullName(context.getStringAttribute("cn"));
}
}
}
検索されたオブジェクト DN は次のとおりです。 cn=toto,dc=dynamease,dc=net ldapTemplate Bean は次のように定義されます。
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" value="ldap://192.168.1.10:10389" />
<property name="base" value="dc=dynamease,dc=net" />
<property name="userDn" value="uid=admin,ou=system" />
<property name="password" value="secret" />
</bean>
現在、DynSubscriberDao.findAll() は前述の例外をスローします。ちなみに、私はすでにクラス名をチェックしました;)
何か案は ?