2014-11-13 14 views
8

Chcę Autowire MongoRepository w mojej klasie usług, i nie jestem w stanie to zrobić. Używam konfiguracji java. To jest mój repozytorium klasa:Autowire MongoRepository in Spring MVC

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

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

} 

Jest to usługa, która wykorzystuje UserRepository:

@Service 
public class TestService { 

    @Autowired 
    private UserRepository repository; 

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

Jest to część mojego kontrolera, który wykorzystuje usługę:

@Controller 
public class TestController { 

    @Autowired 
    private TestService service; 

mój główny java config Klasa wygląda następująco:

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

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

Wyjątek:

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

szukałem rozdzielczość dla tego problemu, ale nie mogłem znaleźć niczego. Skanowanie komponentu IMO powinno znaleźć repozytorium i powiąż je z kontekstem sprężyny. Niestety to nie działa w ten sposób.

Odpowiedz

13

Ok, problem dotyczył adnotacji @EnableMongoRepositories.

Kiedy dodałem nazwę pakietu, aby to ciało (tak to wyglądało: @EnableMongoRepositories ({ "prv.makro.mjur.repository"})) Mogłem autowire mój UserRepository

+0

Ten sam problem! Dzięki! – Enrichman

0

EDIT (po komentarzach i zmieniać oddelegowanego kodzie)

Dzieje się tak, ponieważ aplikacja Wiosna Web ma 2 kontekstach 1 jest kontekst korzeń, a drugi jest kontekst Web (jeden rejestracji przez @EnableWebMvc adnotacja).

proszę wykonać następujące czynności:

1) Zdjąć @Import adnotacji z MjurWebAppConfig - pamiętaj, to jest twoja kontekst internetowej. 2) Dodać @Import w MjurAppConfig config w zasadzie wygląda jak:

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

Kroki te powinny uwidocznić swoją autowired DAO fasoli wewnątrz fasoli serwisowym.


Przed EDIT:

I postawić TestService fasola jest w opakowaniu prv.makro.mjur.service sądząc składnika adnotacji skanowania:

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

Innymi słowy @ComponentScan nie widzi swoją TestService zarejestrowania zależność @Autowired .

Upewnij TestService jest widoczny przez skanowanie składnika i pod powyższym założeniu, jeśli zrobić:

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

powinno działać.

+0

Masz rację, ale w MjurAppConfig Mam zdefiniowane usługi badanie przy użyciu @Bean adnotacji. W każdym razie - dodałem ten pakiet do adnotacji componentScan i generuje ten sam błąd –

+0

Myślę, że ten błąd może być spowodowany, ponieważ UserRepository jest interfejsem, a adnotacja Repository powinna znajdować się na klasie implementacji. Jeśli jednak stworzę klasę, która będzie implementować ten interfejs, będę musiał napisać implementację wszystkich metod, takich jak zapisz lub znajdźBy –

+0

spójrz na moją odpowiedź - dodałem początkową sekcję po twoich aktualizacjach – dimitrisli

1
  1. Tworzenie twój interfejs repozytorium z adnotacją @NoRepositoryBean.
@NoRepositoryBean 
public interface MyRepository<T, ID extends Serializable> extends MongoRepository<T, ID> { 

} 
  1. Tworzenie repozytorium realizację
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. Dodaj @EnableMongoRepository adnotacji do odpowiedniej klasy Configuration lub aplikacji .
@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); 
    } 
}