java - Spring Boot scanBasePackages无法从依赖项中找到bean
问题描述
我有以下内容:
@SpringBootApplication(scanBasePackages = {"com.my.package","com.my.package.mylibrary"})
@EnableAsync
@EnableSwagger2
@ServletComponentScan
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
public class MySpringBootApplication {....}
这个应用程序有 package com.my.package
,它还有一个包含我想在这个应用程序中自动装配的 spring bean 的库依赖项,这些 beancom.my.package.mylibrary
在库中的包中。
所以我把两者都放在了scanBasePackages
. 但是 Spring 无法从库中找到 bean?
编辑:
从图书馆,我有:
package com.my.package.mylibrary.repository;
....
public interface MyRepository extends JpaRepository<..., ....> {....}
在应用程序中,我有:
package com.my.package.controller;
....
@RestController
public class MyController {....}
MySpringBootApplication 位于 com.my.package 中。
错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/my/package/mylibrary/repository/MyRepository
at com.my.package.MySpringBootApplication.main(MySpringBootApplication.java:32)
Caused by: java.lang.ClassNotFoundException: com.my.package.mylibrary.repository.MyRepository
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
我为存储库包添加了@EnableJpaRepositories。现在我看到与 MyRepository 所基于的实体 MyEntity 相关的错误。
"java.lang.TypeNotPresentException: Type com.my.package.mylibrary.domain.MyEntity not present
所以我为“com.my.package.mylibrary.domain”添加了@EntityScan,但这会使应用程序无限卡住。
解决方案
首先,您不需要添加scanBasePackages
属性,@SpringBootApplication
因为基础包是com.my.package
.
如果包完全不同,那么您可以添加它。
如果基本包相同,Spring Boot 将自动拾取 bean。
编写代码时应该遵循一种称为关注点分离的方法。
将您的 MySpringBootApplication 类更新为此:
@SpringBootApplication
@ServletComponentScan
public class MySpringBootApplication {....}
为异步方法执行创建一个单独的配置。
@Configuration
@EnableAsync
public class AsynchronousConfig {.....}
为 Swagger 2 创建一个单独的配置类。
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {....}
创建单独的配置以排除配置。
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
public class ExcludeConfigurationFile {....}
注意: Spring boot 自动配置会自动拾取这些@Configuration
文件
这应该有效。
推荐阅读
- sql - 使用 SQL 正则表达式验证字符串
- sql - 如何在oracle中获取给定字符串之间的字符串
- r - 如何在 paste() 中用空格替换 NA?
- android - 自定义 ChatList UI 设计@主屏幕
- c# - 如何将包含 pdf 的流转换为文本?
- amazon-web-services - Pulumi:如何为 CODE_DEPLOY 控制器配置 ECS 服务
- forth - Forth LEAVE ... LOOP 是如何实现的,因为事先不知道 LEAVE 的数量?
- javascript - 无法使用 JavaScript 打开 chrome 浏览器
- sitecore - 如何为错误代码 404 创建自定义页面?
- python - 按位运算将第 n 位设置为负数