在Spring MVC中自动装配MongoRepository

时间:2014-11-13 19:23:17

标签: java spring mongodb

我想将MongoRepository自动装入我的服务类,但我无法做到这一点。我正在使用java配置。 这是我的存储库类:

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

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

}

这是使用UserRepository的服务:

@Service
public class TestService {

    @Autowired
    private UserRepository repository;

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

这是我使用服务的控制器的一部分:

@Controller
public class TestController {

    @Autowired
    private TestService service;

我的主要java配置类看起来像这样:

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

和mongo配置:

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

例外:

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

我正在寻找这个问题的解决方案,但我找不到任何东西。 IMO组件扫描应该找到存储库,它应该将它绑定到spring上下文。可悲的是,它并没有像那样工作。

3 个答案:

答案 0 :(得分:13)

好的,问题在于@EnableMongoRepositories注释。

当我将包名添加到它的正文时(所以它看起来像是:

@EnableMongoRepositories({"prv.makro.mjur.repository"}) )

我能够自动装配我的UserRepository

答案 1 :(得分:1)

  1. 使用@NoRepositoryBean注释创建存储库界面。
  2. @NoRepositoryBean
    public interface MyRepository<T, ID extends Serializable> extends MongoRepository<T, ID> {
    
    }
    
    1. 创建存储库实现
    2. 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. @EnableMongoRepository注释添加到相应的配置或应用程序类中。
      2. @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);
            }
        }
        

答案 2 :(得分:0)

编辑(在评论和更改发布的代码之后)

这是因为Spring Web应用程序有2个上下文:1是根上下文,另一个是Web上下文(由@EnableWebMvc注释注册的上下文)。

请执行以下操作:

1)从@Import中删除MjurWebAppConfig注释 - 请记住这是您的网络背景。 2)在@Import配置中添加MjurAppConfig,基本上看起来像:

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

这些步骤应该使您的服务bean中的自动装配的DAO bean可见。


编辑前:

我打赌你的TestService bean在包prv.makro.mjur.service下,由组件扫描注释判断:

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

换句话说,@ComponentScan无法看到您的TestService注册@Autowired依赖项。

如果您执行以下操作,请确保组件扫描可以看到TestService,并且在上述情况下可以看到:

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

它应该有用。