BeanCreationException : Invocation of init method failed

53,397

From the JavaDoc for AbstractMethodError:

Thrown when an application tries to call an abstract method. Normally, this error is caught by the compiler; this error can only occur at run time if the definition of some class has incompatibly changed since the currently executing method was last compiled.

This means the deployed version of Spring is different from the one you used to compile the code.

Make sure the deployed libraries are the same version as the ones in your IDE

Share:
53,397
NewBee
Author by

NewBee

Updated on July 09, 2022

Comments

  • NewBee
    NewBee almost 2 years

    I am trying to implement LDAP configuration for my Spring Project but LDAP Repository is not getting initialized.

    Error Trace is -

    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);
        }
    }
    

    Following are dependencies-

    enter image description here

    I am not able to resolve this error. LDAP repositories base package is mentioned in applicationContext.xml but still exption follows. Please let me know for correct implimentation.

    Edit - : Dependency tree

    enter image description here

  • NewBee
    NewBee about 8 years
    I din't get the part "in your IDE". I am using Spring 4.2.5.Release, so should i downgrade. LDAP version is 2.0.4.Release - Is Spring 4.2.5.Release compatible?
  • Jim Garrison
    Jim Garrison about 8 years
    There is a difference between the Spring libraries present in your compile-time and run-time environments. That difference is what is causing the AbstractMethodError.
  • klippy
    klippy about 5 years
    How do you check what the deployed libraries are, and what the IDE libraries are