问题标签 [component-scan]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
293 浏览

java - org.sf.beans.factory.NoSuchBeanDefinitionException:没有可用的 X 类型的合格 bean

我正在尝试在 Spring Boot 中使用 Hibernate 作为 JPA 设置一个简单的项目,我尝试了这个这个教程,并且在这两个(和任何地方)@SpringBootApplication似乎都足以使存储库在整个应用程序范围内都可以访问,因为它包括@ComponentScan,但在我的情况下,它不是。即使这个答案看起来也适合我的情况,但不是。

项目结构

有了这样的结构和这段代码:

我得到:

...创建名称为 “应用程序”的 bean 时出错:通过字段“repo”表示不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException :没有 “medisam.entity.UserRepository” 类型的合格 bean可用:预计至少有 1 个有资格作为 自动装配 候选者的 bean。依赖注解: {@org.springframework.beans.factory.annotation.Autowired(required=true)} ...

只有当我这样做时:

我得到了一个工作代码,但是,如果真的有办法只用 实现这个@SpringBootApplication,我想使用它。

会不会@SpringBootApplication是扫描不正确?

请帮忙

编辑

用户存储库.java

用户.java

0 投票
3 回答
8659 浏览

java - Spring @ComponentScan 不适用于 @Repository

我在与配置类不同的包中有一个存储库,因此我使用@Repostiory 将其注释为以下内容:

我已经对其进行了组件扫描,但它不起作用:

例外:没有可用的“test.UserTest”类型的合格 bean:预计至少有 1 个有资格作为自动装配候选者的 bean。

除非我添加 enableJpaRepositories ,否则为什么组件扫描不能在存储库上工作?我认为 componetScan 就足够了


更新

由于一些答案提供了解决方案,我问的是解释而不是解决方案。以下内容甚至无需对“test”进行组件扫描即可工作:

现在的问题是为什么当它不起作用时我什至需要在 @Repository 上使用组件扫描?为什么在文档中 @Repository 被组件扫描扫描时它没有效果并且@EnableJpaRepostiories 是enoguh?

来自关于组件扫描的 Spring 文档:指示是否应启用对使用 @Component @Repository、@Service 或 @Controller 注释的类的自动检测。

在我的情况下,@Repository 未被检测到

0 投票
2 回答
357 浏览

spring - SpringBoot 不扫描命名包

我基于 SpringBoot 构建了一个演示模块,包括服务器和客户端应用程序。路径如:

我写了两个相互冲突的自定义注释@Client,并@ServerClientApplication.javaServerApplication.java.

当我运行客户端或服务器时,两个注释发生冲突。

我想在没有扫描包的情况下运行 ClientApplication test.server,也适用于 ServerApplication。

我尝试了一些但没有用(springBootVersion = '1.5.11.RELEASE'):


我在 ClientApplication.main 中写错了代码:

SpringApplication.run(***ServerApplication***.class, args).stop();

0 投票
1 回答
124 浏览

java - Spring mvc 对其他包隐藏一个包

这是我的项目结构

从图片中可以看出,我的 ComponentScan 设置为整个项目。但不知何故,“配置”包看不到任何其他包,反之亦然。

如果我运行我的项目,我会在启动时收到一个错误,即没有可用的 'com.rjproject.dao.UserDao' 类型的合格 bean,对于所有其他 bean 也是如此,在这个包中自动装配。但是它们在所有其他软件包中都可以很好地自动装配。

但是这个 bean 存在并且在任何其他包中都可以很好地自动装配。

这里 webSecurityConfig

这里是 MyUserDetailService

}

UPD

正如我所知道的,问题是当我想在配置中自动装配它时,spring bean 还没有创建。但是每个在线示例都说它应该有效。

0 投票
3 回答
1628 浏览

java - SpringBoot 多模块考虑在你的配置中定义一个 bean 类型

我有一个多模块 Spring-boot 应用程序,我有两个子模块:

  • spring-boot-rest-api-待办事项列表
  • 坚持

像这样组织的:

持久化模块

spring-boot-rest-api-todo-list 模块

在我的 rest-api 模块中,我想扫描两个模块(持久性和 restapi),然后我这样进行:

但我收到了这个错误:

如果我"com.medkhelifi.tutorials.spring-boot"从 ComponentScan 中删除,错误就会消失,但我的 restapi 模块下的控制器将无法工作。

我尝试了 ComponentScan 的许多变体,但出现了同样的错误:

0 投票
2 回答
132 浏览

java - 测试中带有 Quartz 的 NoSuchBeanDefinitionException

我有一个使用 Quartz 调度程序的 Spring Boot (2.1.3) 项目。它通过启动器包含在内:

该应用程序(主要)配置有组件扫描。如果我运行应用程序一切都很好。如果我运行一个带有@SprinBootTest所有注释的测试也很好。但是如果我使用这个自定义注释

而不是@SpringBootTest我得到一个NoSuchBeanDefinitionException,因为找不到石英Scheduler

我尝试将 Quartz 包添加到组件扫描中,但这无济于事:

如何使用我的自定义配置注释让 Spring 使用我的测试设置来选择调度程序?

0 投票
0 回答
238 浏览

java - 在 SpringApplication 的 scanBasePackage={...} 中扫描注解

我发现各种各样的方法是扫描我的包中的注释,就像这里的一个:

这些答案的共同点是我需要传递一个字符串,定义要扫描的基本包。

在我的应用程序中,我已经在这里执行此操作:

并且可能在其他一些@ComponentScan注释中。

我的组件之一可能在某个库的这些包中的某处找到,它正在搜索带有注释的其他类@MyAwsomeAnnotation以配置自身。

现在,如果可能的话,我想让这个组件使用某种方式来扫描与它完全相同的包中的注释类SpringBootApplication
这是我没有发现的。

有没有办法从 ApplicationContext 中获取这些路径?


我正在尝试的一种方法是这样的:

  • 在 bean 构建阶段之后,( @PostConstruct) 使用 ApplicationContext 检索所有用 注释的 Bean @ComponentScan。这还将检索使用从like继承的注释进行注释的 bean 。@ComponentScan@SpringBootApplication
  • 获取注释并将值填充到Set<String> packages

问题是,如果对 bean 进行了注释,例如使用 @SpringBootApplication,我无法检索注释 @ComponentScan,因为它实际上并不存在。所以我需要知道所有继承注释,为什么我只认为这是一种方法,而不是解决方案。

0 投票
2 回答
957 浏览

java - 添加 @ComponentScan 以从 jar 加载 bean 后,我的控制器未扫描,我得到 404

我有一个 spring-boot 应用程序(Java8,spring-boot 2.1.4-RELEASE)。

业务层中的一项服务需要从我的类路径中的某个 jar 中 @Autowire 一个 bean。为了实现这一点,我必须添加 @ComponentScan({"package.to.my.bean.inside.the.jar"}) 并且它被神奇地扫描并成功连接(这被添加到主 spring-boot 类中声明主要方法)。

但是,从那时起我的控制器没有被扫描,因此 DispatcherServlet 为我触发的每个请求(默认调度程序)返回 404。实际上,我的整个 spring-boot 应用程序注释都被忽略了——没有执行扫描。只是强调一下 - 在添加 @ComponentScan 之前,该应用程序运行良好。

主要的 spring-boot 应用程序类:

控制器示例:

我尝试将我的 spring-boot 应用程序基础包添加到 @ComponentScan 中的包列表中,但没有成功。我尝试将包声明的范围缩小到仅在我需要但没有运气的类上。这是代码

0 投票
1 回答
253 浏览

java - org.springframework.beans.factory.NoSuchBeanDefinitionException:没有可用的“com.example.simple.RealApplication”类型的合格bean

我无法理解为什么我的 BeanRealApplication没有注册/找到。

文件 DemoApplication.java:

文件 RealApplication.java:


然而,奇怪的是,这段代码有效:

文件 DemoApplication.java:

RealApplication 类没有改​​变。

输出是:

我的 maven pom.xml 看起来像这样:


出于某种奇怪的原因,当我只使用注释时,组件扫描并没有拾取 RealApplication Bean @SpringBootApplication,即使这两个类是同一个包。

但是当我在构造函数中指定要扫描的包时,它能够找到它AnnotationConfigApplicationContext

0 投票
0 回答
560 浏览

java - 无法在多模块 springboot 项目中检索 spring 应用程序上下文/找不到 EntityManagerFactory

我有一个多模块 springboot 项目。这是架构: 在此处输入图像描述

带有注释的类@SpringBootApplication位于顶部模块(webservice)中。@SpringBootTest当我在我的测试类中使用这个顶级模块运行集成测试时,它工作正常。

但现在我想从业务模块运行集成测试。@SpringBootTestonly 不再起作用,因为在业务模块中找不到配置类。所以我在业务模块中创建了一个配置类:

在我的测试类中,我指向了这个配置类,如下所示:

这样做,我希望 Spring 会将包 com.berthoud.p7 及其子文件夹中声明的所有 bean 添加到上下文中。事实上,当我在我的测试类中自动装配 spring bean 时,它现在看起来很好(IntelliJ 不再告诉@autowiredbean 不能自动装配): 在此处输入图像描述

但是,当我运行测试时,Spring 无法加载应用程序上下文:

我不明白这一点。以下是我声明相关 bean 的方式:

我做错了什么?

编辑:像这样更改我的配置类后:

我现在有一个不同的错误: