2014-10-26 2 views
9

Полного сообщениеSpring Неудовлетворенной зависимости выражается через аргумент конструктора с индексом 0 типа

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: 
    Error creating bean with name 'userRepositoryUserDetailsService' defined in file 
    [/Users/tdaley/apache-tomcat-8.0.12/wtpwebapps/cloud-management/WEB-INF/classes/ 
     org/cru/cloud/management/security/UserRepositoryUserDetailsService.class]: 
    Unsatisfied dependency expressed through constructor argument with index 0 of type 
[org.cru.cloud.management.data.UserRepository]: : No qualifying bean of 
    type [org.cru.cloud.management.data.UserRepository] found for dependency: 
     expected at least 1 bean which qualifies 
     as autowire candidate for this dependency. 
    Dependency annotations: {}; 
nested exception is 
    org.springframework.beans.factory.NoSuchBeanDefinitionException: 
     No qualifying bean of type [org.cru.cloud.management.data.UserRepository] found 
     for dependency: expected at least 1 bean 
     which qualifies as autowire candidate for this dependency. 
    Dependency annotations: {} 

Я использую конфигурацию Java. Следующие сегменты кода из пружинной загрузки учебника GS-весна-безопасности-3.2:

package org.cru.cloud.management.security; 

import java.util.Collection; 

import org.cru.cloud.management.data.User; 
import org.cru.cloud.management.data.UserRepository; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.authority.AuthorityUtils; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.core.userdetails.UsernameNotFoundException; 
import org.springframework.stereotype.Service; 

@Service 
public class UserRepositoryUserDetailsService implements UserDetailsService { 
    private final UserRepository userRepository; 

    @Autowired 
    public UserRepositoryUserDetailsService(UserRepository userRepository) { 
     this.userRepository = userRepository; 
    } 

    @Override 
    public UserDetails loadUserByUsername(String username) 
      throws UsernameNotFoundException { 
     User user = userRepository.findByEmail(username); 
     if(user == null) { 
      throw new UsernameNotFoundException("Could not find user " + username); 
     } 
     return new UserRepositoryUserDetails(user); 
    } 

    private final static class UserRepositoryUserDetails extends User implements UserDetails {  

     private UserRepositoryUserDetails(User user) { 
      super(user); 
     } 

     @Override 
     public Collection<? extends GrantedAuthority> getAuthorities() { 
      return AuthorityUtils.createAuthorityList("ROLE_USER"); 
     } 

     @Override 
     public String getUsername() { 
      return getEmail(); 
     } 

     @Override 
     public boolean isAccountNonExpired() { 
      return true; 
     } 

     @Override 
     public boolean isAccountNonLocked() { 
      return true; 
     } 

     @Override 
     public boolean isCredentialsNonExpired() { 
      return true; 
     } 

     @Override 
     public boolean isEnabled() { 
      return true; 
     } 

     private static final long serialVersionUID = 5639683223516504866L; 
    } 
} 

public interface UserRepository extends CrudRepository<User, Long> 
{ 
    User findByEmail(String email); 
} 

Предложение о том, как это исправить?

ответ

0

[org.cru.cloud.management.data.UserRepository]: Нет квалификационного рожкового типа

не может найти UserRepository боба. Возможно, вы забыли поместить аннотацию в UserRepository.

@Component 
public MyClass implements UserRepository{} 

Если вы используете autorire userRepository, то вы MyCLass будете введены.

также:

public MyClass implements UserRepository{} 
public YourClass implements UserRepository{} 

@Autowired 
public blabla(@Qualifier("myClass") UserRepository userRepo) 

@Autowired 
public blabla(@Qualifier("yourClass") UserRepository userRepo) 

Я думаю, что это поможет.

+0

Я пробовал несколько различных видов аннотаций. Что вы предлагаете? – AixNPanes

+0

можете ли вы разместить файл UserRepository? –

+0

Он находится в конце сегмента кода выше. – AixNPanes

7

У вас есть аннотация @EnableJpaRepositories где-то в ваших конфигурационных классах и правильно настроена проверка? По умолчанию пакет, в котором существует аннотированный класс или интерфейс, становится базовым пакетом для сканирования репозитория. Вы можете контролировать это, установив значение в свойство basePackages (или даже лучше - basePackageClasses).

Вы можете использовать Spring Tools Suite, чтобы проверить, какие бобы объявлены в вашем контексте (Хранилища должны быть видны в Spring Elements> Beans> Spring Data Repositories).

+0

Ты прибил его. Я удалил «@EnableJpaRepositories (basePackageClasses = MessageRepository.class)» из DataConfiguration, поскольку я удалял поддержку Message, которая была в образце. Я заменил его на «@EnableJpaRepositories (basePackageClasses = UserRepository.class)», и теперь он работает корректно (по крайней мере, теперь я получаю фрейм для входа). – AixNPanes

+0

Я относительный новичок STS, но я давно использовал Eclipse. Где найдены элементы весны? – AixNPanes

+0

Вы должны добавить Spring к проекту (щелкните правой кнопкой мыши> Инструменты весны> Добавить весну природы). Возможно, вам придется перейти к свойствам проекта, а в Spring> Beans Support на вкладке «Проверка конфигурации» установите флажок «Автоматическое обнаружение аннотированных файлов конфигурации Java Spring».После того, как вы это сделали и очистили проект, Spring Elements должны быть видны как один из элементов проекта (например, дескриптор развертывания или ресурсы Java). – Apokralipsa

0

Annotatate ваш класс, реализующий UserRepository с пружинным @Component аннотации

@Component 
public MyUserRepository implements UserRepository 
{ 
    User findByEmail(String email){ 
      return new User(); 
    } 
} 
+0

Как и в образце, с которого он был нарисован, не существует класса реализации. Просто интерфейс UserRepository. – AixNPanes

+0

Насколько я понимаю, вы хотите ввести пользовательский компонент, в котором вы написали бизнес-логику, чтобы фактически получить пользователя. Итак, где этот код реализован? –

+0

Я думаю, что если вы получите свои аннотации правильно, в моем случае «@EnableJpaRepositories (basePackageClasses = UserRepository.class», то Spring построит свой собственный прокси для интерфейса. – AixNPanes

-2

Кажется, вы используете @EnableJpaRepositories настроить хранилище базы данных. Он имеет два варианта загрузки, следующий метод, который вы можете использовать.

@EnableJpaRepositories(basePackages={"com.test.repo"}) 

или

@EnableJpaRepositories(basePackageClasses=TestRepo.class) 
Смежные вопросы

 Смежные вопросы