2016-05-02 13 views
4

私のSpringプロジェクトのLDAP設定を実装しようとしていますが、LDAPリポジトリが初期化されていません。BeanCreationException:initメソッドの呼び出しに失敗しました

エラートレースがある -

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

次は、私はこのエラーを解決することはできませんよ

enter image description here

dependencies-です。 LDAPリポジトリの基本パッケージはapplicationContext.xmlに記述されていますが、まだ例外があります。 正しいインパネレーションについて教えてください。

編集 - :依存関係ツリーAbstractMethodErrorのJavaDocから

enter image description here

+0

が展開されたライブラリは、あなたのIDEでのものと同じバージョンであることを確認します。私はまた、依存関係がすべての依存関係であることを非常に疑っています。 'mvn dependency:tree'を使って、あなたの質問に(画像の代わりに)出力を加えてください。 –

+0

依存ツリーの追加Screenshot – NewBee

+0

これは、より多くの依存関係を持つべき出力ではありませんが、スクリーンショットには表示されません。私は新しいものに見えるspring-data-commonsの依存関係をダウングレードします.Spring LDAPはSpring 3.2とSpring Data commons 1.11に依存しますが、後者を格下げすることをお勧めします。 –

答えて

1

アプリケーションがabstractメソッドを呼び出そうとした場合にスローされます。通常、このエラーはコンパイラによって検出されます。このエラーは、実行中のメソッドが最後にコンパイルされた後に、一部のクラスの定義が互換性なく変更された場合にのみ実行時に発生します。

これは、コードのコンパイルに使用したものとSpringのデプロイ済みバージョンが異なることを意味します。あなたは、フレームワークの異なるバージョンを混在さおよび/またはバージョンの互換性のない組み合わせを使用している

+0

"あなたのIDEの中に"部品を持っていません。私はSpring 4.2.5を使用しています.Release、私はダウングレードする必要があります。 LDAPバージョンは2.0.4です.Release - Spring 4.2.5.Releaseは互換性がありますか? – NewBee

+0

コンパイル時および実行時環境に存在するSpringライブラリには違いがあります。その違いが 'AbstractMethodError'の原因です。 –

関連する問題