2014-11-13 15 views
8

Desidero rendere Autowire MongoRepository nella mia classe di servizio e non sono in grado di farlo. Sto usando java config. Questa è la mia classe repository:Autowire MongoRepository in Spring MVC

@Repository 
public interface UserRepository extends MongoRepository<User, String> { 

    public User findByFirstName(String firstName); 
    public List<User> findByLastName(String lastName); 

} 

Questo è il servizio che utilizza UserRepository:

@Service 
public class TestService { 

    @Autowired 
    private UserRepository repository; 

    public void save(User user) { 
     repository.save(user); 
    } 
} 

Questo fa parte del mio controllo, che utilizza il servizio:

@Controller 
public class TestController { 

    @Autowired 
    private TestService service; 

mio principale config java classe si presenta così:

@Configuration 
@EnableWebMvc 
@EnableMongoRepositories 
@Import({MjurAppConfig.class, MongoConfiguration.class}) 
@ComponentScan({"prv.makro.mjur.controller"}) 
public class MjurWebAppConfig extends WebMvcConfigurerAdapter { 

MjurAppConfig:

@Configuration 
@ComponentScan({"prv.makro.mjur.dao", "prv.makro.mjur.repository"}) 
public class MjurAppConfig { 

    @Bean 
    public User getUser() { 
     return new User(); 
    } 

    @Bean 
    public TestService getTestService() { 
     return new TestService(); 
    } 
} 

E mongo config:

@Configuration 
public class MongoConfiguration { 

    @Bean 
    public MongoFactoryBean mongo() { 
     MongoFactoryBean mongo = new MongoFactoryBean(); 
     mongo.setHost("localhost"); 
     mongo.setPort(27017); 
     return mongo; 
    } 

    @Bean 
    public MongoTemplate mongoTemplate() throws Exception{ 
     return new MongoTemplate(mongo().getObject(),"mjur"); 
    } 
} 

Eccezione:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private prv.makro.mjur.repository.UserRepository 
prv.makro.mjur.service.impl.FirstService.repository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [prv.makro.mjur.repository.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. 
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

Ero alla ricerca di soluzione per questo problema, ma non ho trovato nulla. La scansione del componente IMO dovrebbe trovare il repository e dovrebbe collegarlo al contesto primaverile. Purtroppo non funziona così.

risposta

13

Ok, il problema era con l'annotazione @EnableMongoRepositories.

Quando ho aggiunto il nome del pacchetto per il suo corpo (così sembrava: @EnableMongoRepositories ({ "prv.makro.mjur.repository"})) ero in grado di autowire mia UserRepository

+0

Lo stesso problema! Grazie! – Enrichman

0

EDIT (dopo i commenti e modificare il codice scritto)

Questo sta accadendo perché l'applicazione Web Primavera ha 2 contesti: 1 è il contesto radice e un altro è il contesto Web (quello della registrazione da parte del @EnableWebMvc annotazione).

eseguire le seguenti operazioni:

1) Rimuovere il @Import annotazione dal tuo MjurWebAppConfig - ricordate che questo è il tuo contesto web. 2) Aggiungere il @Import nella configurazione MjurAppConfig essenzialmente cercando come:

@Configuration 
@Import({MongoConfiguration.class}) 
@ComponentScan({"prv.makro.mjur.dao", "prv.makro.mjur.repository"}) 
public class MjurAppConfig { 
//.. 

Questi passaggi dovrebbero rendere visibile il vostro fagioli autowired DAO all'interno del chicco di servizio.


Prima EDIT:

Scommetto il bean TestService è sotto pacchetto prv.makro.mjur.service a giudicare dalla annotazione scansione componenti:

@ComponentScan({"prv.makro.mjur.controller"}) 

In altre parole @ComponentScan non possono vedere il tuo TestService per registrare il @Autowired dipendenze .

Assicurarsi TestService è visibile la scansione dei componenti e sotto l'ipotesi di cui sopra se si fa:

@ComponentScan({"prv.makro.mjur"}) 

dovrebbe funzionare.

+0

Hai ragione, ma in MjurAppConfig ho definito il servizio di prova con l'annotazione @Bean. Comunque, ho aggiunto il pacchetto all'annotazione ComponentScan e genera lo stesso errore –

+0

Penso che l'errore potrebbe essere causato dal fatto che UserRepository è un'interfaccia e che l'annotazione del repository dovrebbe essere nella classe di implementazione. Tuttavia se creerò la classe che implementerà questa interfaccia, dovrò scrivere l'implementazione di tutti i metodi come save o findBy –

+0

guarda la mia risposta - ho aggiunto la sezione iniziale dopo i tuoi aggiornamenti – dimitrisli

1
  1. Crea l'interfaccia del repository con annotazione @NoRepositoryBean.
@NoRepositoryBean 
public interface MyRepository<T, ID extends Serializable> extends MongoRepository<T, ID> { 

} 
  1. Creare la realizzazione Repository
public class MyRepositoryImpl<T, ID extends Serializable> 
    extends SimpleMongoRepository<T, ID> { 

    public PermissableRepositoryImpl(
     final MongoEntityInformation<T, ID> metadata, 
     final MongoOperations mongoOperations 
    ) { 

     super(metadata, mongoOperations); 
    } 
} 
  1. Aggiungi @EnableMongoRepository annotazione al tuo appropriata classe di configurazione o di applicazione .
@ComponentScan(basePackages = {"com.company"}) 
@EnableMongoRepositories(repositoryBaseClass = MyRepositoryImpl.class) 
@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    public static void main(final String[] args) { 

     SpringApplication.run(Application.class, args); 
    } 

    @Override 
    protected final SpringApplicationBuilder configure(final SpringApplicationBuilder applicationBuilder) { 

     return applicationBuilder.sources(Application.class); 
    } 
} 
Problemi correlati