Spring LDAP — Создание LdapTemplate в автономной программе Java — Использование Spring LDAP в качестве ресурса CDI

Я пытаюсь создать объект LdapTemplate с использованием данных Spring.

 public class LDAPTemplate {

        public static void main(String[] args) {
            LdapContextSource lcs = new LdapContextSource();
            lcs.setUrl("ldap://localhost:389/");
            lcs.setUserDn("cn=Manager, dc=example, dc=com");
            lcs.setPassword("secret1");
            lcs.setDirObjectFactory(DefaultDirObjectFactory.class);
            LdapTemplate ldap = new LdapTemplate(lcs);
            ldap.lookup("cn=aaa");

        }

    }

Я хотел знать, что это правильный способ создания экземпляра объекта шаблона ldap. Потому что, когда я выполняю поиск, он выдает NPE.

Я пытаюсь использовать LDAP Spring в контексте CDI, вообще не используя Spring. Если у вас есть указатели на это было бы неплохо. Зависит ли Spring LDAP от spring?


person VirtualLogic    schedule 16.03.2014    source источник


Ответы (3)


LdapContextSource равно InitializingBean поэтому вам нужно позвонить afterPropertiesSet...

И JavaDoc:

При использовании реализаций этого класса вне контекста Spring необходимо вызвать afterPropertiesSet(), когда установлены все свойства, чтобы завершить инициализацию.

person Pavel Horal    schedule 16.03.2014

Правильный код

public class LDAPTemplate {
    public static void main(String[] args) {
        LdapContextSource lcs = new LdapContextSource();
        lcs.setUrl("ldap://localhost:389/");
        lcs.setUserDn("cn=Manager, dc=example, dc=com");
        lcs.setPassword("secret1");
        lcs.setDirObjectFactory(DefaultDirObjectFactory.class);
        lcs.afterPropertiesSet();
        LdapTemplate ldap = new LdapTemplate(lcs);
        ldap.lookup("cn=aaa");

    }
}
person VirtualLogic    schedule 16.03.2014

Решение: использовать Spring LDAP в CDI-контенте без использования Spring IoC

  1. Создайте производителя ресурсов для шаблона LDAP.

    public class Resources {
    private LdapTemplate template;
    
    @Produces
    //It is a custom qualifier
    @CustomeLDAPTemplate
    public LdapTemplate getTemplate() {
        LdapContextSource lcs = new LdapContextSource();
        lcs.setUrl("ldap://localhost:389/");
        lcs.setUserDn("cn=Manager, dc=example, dc=com");
        lcs.setPassword("secret1");
        lcs.setDirObjectFactory(DefaultDirObjectFactory.class);
        lcs.afterPropertiesSet();
        template = new LdapTemplate(lcs);
        return template;
    }
    
    public void setTemplate(LdapTemplate template) {
        this.template = template;
     }
    }
    
  2. Создайте настраиваемый квалификатор — чтобы сказать, что я хочу объект шаблона типа LdapTemplate и CustomeLDAPTemplate.

    @Qualifier  
    @Retention(RUNTIME)  
    @Target({TYPE,CONSTRUCTOR, METHOD, FIELD})  
    public @interface CustomeLDAPTemplate {}  
    
  3. Реализация - я использовал класс JAX-WS для проверки.

    @Path("/users")
    @RequestScoped
    public class UserResource {
    
        @Inject
        @CustomeLDAPTemplate
        private LdapTemplate template;
    
        @POST
        @Consumes(MediaType.APPLICATION_XML)
        public Response createUser(InputStream is){
            User user = readStream(is);
            System.out.println("LDAP Look up " + template.lookup("cn=aaa,ou=Org1, dc=example, dc=com").toString());
            uRepo.save(user);
            return Response.created(URI.create("/users/" + user.getUser_id())).build();
        }   
    }
    
person VirtualLogic    schedule 16.03.2014