无法在Spring Boot应用程序中的不同包中加载bean

时间:2016-07-07 08:21:35

标签: java spring spring-boot

我试图在Spring启动应用程序中从不同的包加载bean。这是我的主要课程,它位于 com.xyz.app 包中:

Application.java

@SpringBootApplication(scanBasePackages = { "com.xyz.app.repository" })
public class Application extends SpringBootServletInitializer {

 @Override
 protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
 }

 public static void main(String[] args) {
    ConfigurableApplicationContext context = 
                            SpringApplication.run(Application.class, args);

    context.getBean(MyInterfaceRepository.class).loadData();
 }

界面 MyInterfaceRepository.java 位于 com.xyz.app.repository 包内,并且定义如下:

@RepositoryRestResource(collectionResourceRel = "aas", path = "aas")
public interface MyInterfaceRepository extends MongoRepository<MyClass, Long>, 
                                                 MyCustomInterface {
  ...
}

然后,我还有一个 MyInterfaceRepositoryImpl.java ,它位于 com.xyz.app.repository ,提供 MyCustomInterface.java 的实现,它也存在于 com.xyz.app.repository

启动我的应用程序我得到以下内容:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.xyz.app.repository.MyInterfaceRepository] is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:372)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:332)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1066)
    at com.xyz.app.Application.main(Application.java:60)

我已经检查了,确实如果我把 MyInterfaceRepository.java MyInterfaceRepositoryImpl.java 放在同一个地方打包为 Application.java com.xyz.app ,而不是它的工作原理。

似乎Spring无法从 Application.java 所在的包中加载bean。

此外,我尝试用以下内容替换 @SpringBootApplication

@Configuration
@EnableAutoConfiguration
@ComponentScan({"com.xyz.app.repository"})

同样的问题..有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果您使用的是spring mongodb,则无需使用注释:@RepositoryRestResource(collectionResourceRel = "aas", path = "aas")

您还可以在@Autowired中使用MyInterfaceRepository

答案 1 :(得分:0)

在您的应用程序类/主类上添加@EnableMongoRepositories。你应该有这样的东西:

@SpringBootApplication(scanBasePackages = {"com.xyz.app"})
@EnableMongoRepositories(basePackages = {"com.xyz.app.repository"}, repositoryBaseClass = MyInterfaceRepositoryImpl.class)
public class Application extends SpringBootServletInitializer {
    ...
}

有关注释的详细信息,请参阅EnableMongoRepositories