2016-05-02 12 views
4

Ich versuche LDAP-Konfiguration für meine Spring-Projekt zu implementieren, aber LDAP-Repository wird nicht initialisiert.BeanCreationException: Aufruf der Init-Methode fehlgeschlagen

Fehler Trace ist -

xx:xx:xx.116 [localhost-startStop-1] WARN o.s.w.c.s.XmlWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepo': Invocation of init method failed; nested exception is java.lang.AbstractMethodError: org.springframework.ldap.repository.support.LdapRepositoryFactory$LdapQueryLookupStrategy.resolveQuery(Ljava/lang/reflect/Method;Lorg/springframework/data/repository/core/RepositoryMetadata;Lorg/springframework/data/projection/ProjectionFactory;Lorg/springframework/data/repository/core/NamedQueries;)Lorg/springframework/data/repository/query/RepositoryQuery; 
xx:xx:xx.124 [localhost-startStop-1] ERROR o.s.web.context.ContextLoader - Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepo': Invocation of init method failed; nested exception is java.lang.AbstractMethodError: org.springframework.ldap.repository.support.LdapRepositoryFactory$LdapQueryLookupStrategy.resolveQuery(Ljava/lang/reflect/Method;Lorg/springframework/data/repository/core/RepositoryMetadata;Lorg/springframework/data/projection/ProjectionFactory;Lorg/springframework/data/repository/core/NamedQueries;)Lorg/springframework/data/repository/query/RepositoryQuery; 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) [spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5068) [catalina.jar:7.0.68] 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5584) [catalina.jar:7.0.68] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) [catalina.jar:7.0.68] 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1572) [catalina.jar:7.0.68] 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1562) [catalina.jar:7.0.68] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_73] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_73] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_73] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_73] 
Caused by: java.lang.AbstractMethodError: org.springframework.ldap.repository.support.LdapRepositoryFactory$LdapQueryLookupStrategy.resolveQuery(Ljava/lang/reflect/Method;Lorg/springframework/data/repository/core/RepositoryMetadata;Lorg/springframework/data/projection/ProjectionFactory;Lorg/springframework/data/repository/core/NamedQueries;)Lorg/springframework/data/repository/query/RepositoryQuery; 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:435) ~[spring-data-commons-1.12.1.RELEASE.jar:na] 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:220) ~[spring-data-commons-1.12.1.RELEASE.jar:na] 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:266) ~[spring-data-commons-1.12.1.RELEASE.jar:na] 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:252) ~[spring-data-commons-1.12.1.RELEASE.jar:na] 
    at org.springframework.ldap.repository.support.LdapRepositoryFactoryBean.afterPropertiesSet(LdapRepositoryFactoryBean.java:47) ~[spring-ldap-core-2.0.4.RELEASE.jar:2.0.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    ... 21 common frames omitted 

UserRepo.java

package domain; 

import org.springframework.ldap.repository.LdapRepository; 
import java.util.List; 


public interface UserRepo extends LdapRepository<User> { 
    User findByEmployeeNumber(int employeeNumber); 
    List<User> findByFullNameContains(String name); 
} 

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:ldap="http://www.springframework.org/schema/ldap" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/ldap http://www.springframework.org/schema/ldap/spring-ldap.xsd"> 

    <context:property-placeholder location="classpath:/ldap.properties" system-properties-mode="OVERRIDE" /> 
    <context:annotation-config /> 

    <ldap:context-source id="contextSource" 
         password="${sample.ldap.password}" 
         url="${sample.ldap.url}" 
         username="${sample.ldap.userDn}" 
         base="${sample.ldap.base}" /> 

    <ldap:ldap-template id="ldapTemplate" context-source-ref="contextSource"/> 

    <!-- 
     This will scan the org.springframework.ldap.samples.useradmin.domain package for interfaces 
     extending CrudRepository (in our case, LdapRepository), automatically creating repository 
     beans based on these interfaces. 
    --> 
    <ldap:repositories base-package="domain" /> 


    <bean class="service.UserService"> 
     <property name="directoryType" value="${sample.ldap.directory.type}" /> 
    </bean> 

    <!-- Required to make sure BaseLdapName is populated in UserService --> 
    <bean class="org.springframework.ldap.core.support.BaseLdapPathBeanPostProcessor" /> 

    <beans profile="default"> 
     <!-- Populates the LDAP server with initial data --> 
     <bean class="org.springframework.ldap.test.LdifPopulator" depends-on="embeddedLdapServer"> 
      <property name="contextSource" ref="contextSource" /> 
      <property name="resource" value="classpath:/setup_data.ldif" /> 
      <property name="base" value="${sample.ldap.base}" /> 
      <property name="clean" value="${sample.ldap.clean}" /> 
      <property name="defaultBase" value="dc=example,dc=com" /> 
     </bean> 

     <!-- 
      This is for test and demo purposes only - EmbeddedLdapServerFactoryBean launches an in-process 
      LDAP server. 
     --> 
     <bean id="embeddedLdapServer" class="org.springframework.ldap.test.EmbeddedLdapServerFactoryBean"> 
      <property name="partitionName" value="example"/> 
      <property name="partitionSuffix" value="${sample.ldap.base}" /> 
      <property name="port" value="18880" /> 
     </bean> 
    </beans> 

    <beans profile="no-apacheds"> 
     <!-- Populates the LDAP server with initial data --> 
     <bean class="org.springframework.ldap.test.LdifPopulator"> 
      <property name="contextSource" ref="contextSource" /> 
      <property name="resource" value="classpath:/setup_data.ldif" /> 
      <property name="base" value="${sample.ldap.base}" /> 
      <property name="clean" value="${sample.ldap.clean}" /> 
      <property name="defaultBase" value="dc=example,dc=com" /> 
     </bean> 
    </beans> 
</beans> 

UserService.java

package service; 

import java.util.List; 
import java.util.Set; 

import javax.naming.Name; 
import javax.naming.ldap.LdapName; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.ldap.core.support.BaseLdapNameAware; 
import org.springframework.ldap.support.LdapNameBuilder; 
import org.springframework.ldap.support.LdapUtils; 

import com.google.common.base.Function; 
import com.google.common.collect.Iterables; 
import com.google.common.collect.Sets; 

import domain.DirectoryType; 
import domain.User; 
import domain.UserRepo; 

/** 
* 
*/ 
public class UserService implements BaseLdapNameAware { 

    private final UserRepo userRepo; 
    private LdapName baseLdapPath; 
    private DirectoryType directoryType; 

    @Autowired 
    public UserService(UserRepo userRepo) { 
     this.userRepo = userRepo; 
     //this.groupRepo = groupRepo; 
    } 


    public void setDirectoryType(DirectoryType directoryType) { 
     this.directoryType = directoryType; 
    } 

    public void setBaseLdapPath(LdapName baseLdapPath) { 
     this.baseLdapPath = baseLdapPath; 
    } 

    public Iterable<User> findAll() { 
     return userRepo.findAll(); 
    } 

    public User findUser(String userId) { 
     return userRepo.findOne(LdapUtils.newLdapName(userId)); 
    } 



    public LdapName toAbsoluteDn(Name relativeName) { 
     return LdapNameBuilder.newInstance(baseLdapPath) 
       .add(relativeName) 
       .build(); 
    } 

    /** 
    * This method expects absolute DNs of group members. In order to find the actual users 
    * the DNs need to have the base LDAP path removed. 
    * 
    * @param absoluteIds 
    * @return 
    */ 
    public Set<User> findAllMembers(Iterable<Name> absoluteIds) { 
     return Sets.newLinkedHashSet(userRepo.findAll(toRelativeIds(absoluteIds))); 
    } 

    public Iterable<Name> toRelativeIds(Iterable<Name> absoluteIds) { 
     return Iterables.transform(absoluteIds, new Function<Name, Name>() { 
      public Name apply(Name input) { 
       return LdapUtils.removeFirst(input, baseLdapPath); 
      } 
     }); 
    } 


    public List<User> searchByNameName(String lastName) { 
     return userRepo.findByFullNameContains(lastName); 
    } 
} 

Im Folgenden sind dependencies-

enter image description here

ich nicht in der Lage bin, diesen Fehler zu beheben. Das Basispaket für LDAP-Repositorys wird in applicationContext.xml erwähnt, es folgt jedoch weiterhin die Option "exption". Bitte lassen Sie mich für die korrekte Umsetzung wissen.

Bearbeiten -: Abhängigkeitsbaum

enter image description here

+0

Sie verschiedene Versionen eines Rahmen Mischen und/oder verwenden eine inkompatible Kombination aus den Varianten. Ich bezweifle auch sehr, dass die gezeigten Abhängigkeiten * alle * Abhängigkeiten sind. Verwenden Sie 'mvn dependency: tree' und fügen Sie die Ausgabe (anstelle des Bildes) zu Ihrer Frage hinzu. –

+0

Hinzugefügt Abhängigkeitsbaum Screenshot – NewBee

+0

Das ist nicht die Ausgabe, Sie sollten mehr Abhängigkeiten haben, aber diese sind nicht im Screenshot sichtbar. Ich würde die Abhängigkeit für Spring-Data-Commons, die auf neu aussieht, herabstufen. Spring-LDAP hängt von Spring 3.2 und Spring Data Commons 1.11 ab, ich würde vorschlagen, Letzteres herunterzustufen. –

Antwort

1

Vom JavaDoc für AbstractMethodError:

Geworfen, wenn eine Anwendung versucht, eine abstrakte Methode zu nennen. Normalerweise wird dieser Fehler vom Compiler abgefangen. Dieser Fehler kann nur zur Laufzeit auftreten, wenn sich die Definition einer Klasse inkompatibel geändert hat, seit die aktuell ausgeführte Methode zuletzt kompiliert wurde.

Dies bedeutet, dass sich die bereitgestellte Version von Spring von der Version unterscheidet, die Sie zum Kompilieren des Codes verwendet haben.

Sicherstellen, dass die eingesetzten Bibliotheken die gleiche Version wie die in Ihrem IDE sind

+0

Ich bekomme den Teil "in Ihrer IDE" nicht. Ich verwende Spring 4.2.5.Release, also sollte ich herunterstufen. LDAP-Version ist 2.0.4.Release - Ist Frühling 4.2.5.Release kompatibel? – NewBee

+0

Es gibt einen Unterschied zwischen den Spring-Bibliotheken in den Kompilierungs- und Laufzeitumgebungen. Dieser Unterschied verursacht den 'AbstractMethodError'. –

Verwandte Themen