首页 > 解决方案 > 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,但这会使应用程序无限卡住。

标签: javaspringspring-boot

解决方案


首先,您不需要添加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文件

这应该有效。


推荐阅读