0

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() は前述の例外をスローします。ちなみに、私はすでにクラス名をチェックしました;)

何か案は ?

4

0 に答える 0