问题标签 [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.
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
java - Spring @ComponentScan 不适用于 @Repository
我在与配置类不同的包中有一个存储库,因此我使用@Repostiory 将其注释为以下内容:
我已经对其进行了组件扫描,但它不起作用:
例外:没有可用的“test.UserTest”类型的合格 bean:预计至少有 1 个有资格作为自动装配候选者的 bean。
除非我添加 enableJpaRepositories ,否则为什么组件扫描不能在存储库上工作?我认为 componetScan 就足够了
更新:
由于一些答案提供了解决方案,我问的是解释而不是解决方案。以下内容甚至无需对“test”进行组件扫描即可工作:
现在的问题是为什么当它不起作用时我什至需要在 @Repository 上使用组件扫描?为什么在文档中 @Repository 被组件扫描扫描时它没有效果并且@EnableJpaRepostiories 是enoguh?
来自关于组件扫描的 Spring 文档:指示是否应启用对使用 @Component @Repository、@Service 或 @Controller 注释的类的自动检测。
在我的情况下,@Repository 未被检测到
spring - SpringBoot 不扫描命名包
我基于 SpringBoot 构建了一个演示模块,包括服务器和客户端应用程序。路径如:
我写了两个相互冲突的自定义注释@Client
,并@Server
在ClientApplication.java
和ServerApplication.java
.
当我运行客户端或服务器时,两个注释发生冲突。
我想在没有扫描包的情况下运行 ClientApplication test.server
,也适用于 ServerApplication。
我尝试了一些但没有用(springBootVersion = '1.5.11.RELEASE'):
我在 ClientApplication.main 中写错了代码:
SpringApplication.run(***ServerApplication***.class, args).stop();
java - Spring mvc 对其他包隐藏一个包
从图片中可以看出,我的 ComponentScan 设置为整个项目。但不知何故,“配置”包看不到任何其他包,反之亦然。
如果我运行我的项目,我会在启动时收到一个错误,即没有可用的 'com.rjproject.dao.UserDao' 类型的合格 bean,对于所有其他 bean 也是如此,在这个包中自动装配。但是它们在所有其他软件包中都可以很好地自动装配。
但是这个 bean 存在并且在任何其他包中都可以很好地自动装配。
这里 webSecurityConfig
这里是 MyUserDetailService
}
UPD
正如我所知道的,问题是当我想在配置中自动装配它时,spring bean 还没有创建。但是每个在线示例都说它应该有效。
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 的许多变体,但出现了同样的错误:
java - 测试中带有 Quartz 的 NoSuchBeanDefinitionException
我有一个使用 Quartz 调度程序的 Spring Boot (2.1.3) 项目。它通过启动器包含在内:
该应用程序(主要)配置有组件扫描。如果我运行应用程序一切都很好。如果我运行一个带有@SprinBootTest
所有注释的测试也很好。但是如果我使用这个自定义注释
而不是@SpringBootTest
我得到一个NoSuchBeanDefinitionException
,因为找不到石英Scheduler
。
我尝试将 Quartz 包添加到组件扫描中,但这无济于事:
如何使用我的自定义配置注释让 Spring 使用我的测试设置来选择调度程序?
java - 在 SpringApplication 的 scanBasePackage={...} 中扫描注解
我发现各种各样的方法是扫描我的包中的注释,就像这里的一个:
这些答案的共同点是我需要传递一个字符串,定义要扫描的基本包。
在我的应用程序中,我已经在这里执行此操作:
并且可能在其他一些@ComponentScan
注释中。
我的组件之一可能在某个库的这些包中的某处找到,它正在搜索带有注释的其他类@MyAwsomeAnnotation
以配置自身。
现在,如果可能的话,我想让这个组件使用某种方式来扫描与它完全相同的包中的注释类SpringBootApplication
。
这是我没有发现的。
有没有办法从 ApplicationContext 中获取这些路径?
我正在尝试的一种方法是这样的:
- 在 bean 构建阶段之后,(
@PostConstruct
) 使用 ApplicationContext 检索所有用 注释的 Bean@ComponentScan
。这还将检索使用从like继承的注释进行注释的 bean 。@ComponentScan
@SpringBootApplication
- 获取注释并将值填充到
Set<String> packages
问题是,如果对 bean 进行了注释,例如使用 @SpringBootApplication,我无法检索注释 @ComponentScan,因为它实际上并不存在。所以我需要知道所有继承注释,为什么我只认为这是一种方法,而不是解决方案。
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 中的包列表中,但没有成功。我尝试将包声明的范围缩小到仅在我需要但没有运气的类上。这是代码
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
java - 无法在多模块 springboot 项目中检索 spring 应用程序上下文/找不到 EntityManagerFactory
带有注释的类@SpringBootApplication
位于顶部模块(webservice)中。@SpringBootTest
当我在我的测试类中使用这个顶级模块运行集成测试时,它工作正常。
但现在我想从业务模块运行集成测试。@SpringBootTest
only 不再起作用,因为在业务模块中找不到配置类。所以我在业务模块中创建了一个配置类:
在我的测试类中,我指向了这个配置类,如下所示:
这样做,我希望 Spring 会将包 com.berthoud.p7 及其子文件夹中声明的所有 bean 添加到上下文中。事实上,当我在我的测试类中自动装配 spring bean 时,它现在看起来很好(IntelliJ 不再告诉@autowired
bean 不能自动装配):
但是,当我运行测试时,Spring 无法加载应用程序上下文:
我不明白这一点。以下是我声明相关 bean 的方式:
我做错了什么?
编辑:像这样更改我的配置类后:
我现在有一个不同的错误: