2014-10-26 9 views
9

Il messaggio completo èPrimavera Insoddisfatto dipendenza esprime attraverso argomento del costruttore con indice 0 di tipo

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: {} 

sto utilizzando la configurazione di Java. I seguenti segmenti di codice sono a partire dalla primavera del tutorial di avvio gs-spring-security-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); 
} 

Suggerimenti su come risolvere questo problema?

risposta

0

[org.cru.cloud.management.data.UserRepository]:: No fagiolo qualificazione di tipo

Non riesci a trovare fagioli UserRepository. Forse hai dimenticato di mettere l'annotazione su UserRepository.

@Component 
public MyClass implements UserRepository{} 

se si autowire userRepository si verrà iniettati MyClass.

anche:

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

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

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

Credo che questo sarà di aiuto.

+0

Ho provato diversi tipi di annotazioni. Quale suggerisci? – AixNPanes

+0

puoi pubblicare il file UserRepository? –

+0

Si trova nella coda del segmento di codice sopra. – AixNPanes

7

Avete l'annotazione @EnableJpaRepositories da qualche parte nelle vostre classi di configurazione e la scansione è stata impostata correttamente? Di default il pacchetto in cui esiste la classe annotata o l'interfaccia diventa il pacchetto base per la scansione del repository. Puoi controllarlo impostando un valore sulla proprietà basePackages (o anche meglio - basePackageClasses).

È possibile utilizzare Spring Tools Suite per verificare quali bean sono dichiarati nel proprio contesto (i repository dovrebbero essere visibili in Spring Elements> Beans> Spring Data Repositories).

+0

Hai inchiodato. Ho rimosso "@EnableJpaRepositories (basePackageClasses = MessageRepository.class)" da DataConfiguration mentre stavo eliminando il supporto dei messaggi che era nell'esempio. L'ho sostituito con "@EnableJpaRepositories (basePackageClasses = UserRepository.class)" e ora funziona correttamente (almeno ora sto ottenendo il frame di accesso). – AixNPanes

+0

Sono un novizio STS relativo, ma ho usato Eclipse per anni. Dove si trova Spring Elements? – AixNPanes

+0

Devi aggiungere la natura Spring al progetto (fai clic con il tasto destro> Strumenti Spring> Aggiungi natura Spring). Potrebbe essere necessario accedere alle proprietà del progetto e in Spring> Beans Support, nella scheda di rilevamento della configurazione, selezionare "Rilevamento automatico per file di configurazione Java Spring annotati".Dopo averlo fatto e aver pulito il progetto, Spring Elements dovrebbe essere visibile come uno degli elementi del progetto (come Deployment Descriptor o Java Resources). – Apokralipsa

0

Annotatate tua classe che implementa UserRepository con molla @Component annotazione

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

Come nell'esempio da cui è stato disegnato, non esiste una classe di implementazione. Solo l'interfaccia UserRepository. – AixNPanes

+0

Per quanto ho capito, si desidera iniettare un bean personalizzato in cui è stata scritta la logica aziendale per ottenere effettivamente l'utente. Quindi, dove viene implementato questo codice? –

+0

Penso che se ottieni le tue annotazioni nel modo giusto, nel mio caso "@EnableJpaRepositories (basePackageClasses = UserRepository.class", Spring creerà il proprio proxy per l'interfaccia – AixNPanes

-2

Sembra che si sta utilizzando @EnableJpaRepositories per configurare il repository database. Dispone di due bean di caricamento delle opzioni, il seguente metodo che è possibile utilizzare.

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

o

@EnableJpaRepositories(basePackageClasses=TestRepo.class) 
Problemi correlati