SpringBoot:无法从其他Jar库自动装配类

Jow*_*own 15 java jdbc spring-data spring-data-jpa spring-boot

我正在开发一个SpringBoot应用程序(例如MyApp),它依赖于两个具有不同实现的数据项目:

数据了jdbc.jar

  • 使用spring-boot-starter-jdbcmy来构建公开我的应用程序将使用的JDBCDataService类

示例代码:

@Service 
public class JDBCDataServiceImpl implements JDBCDataService {

@Autowired
private JDBCDataRepository jdbcDataRepository;    
... 
}
Run Code Online (Sandbox Code Playgroud)
  • 与包 my.data.jdbc
  • 没有SpringBoot主类.仅为单元测试类创建Spring配置
  • 存储库类正在使用 JDBCTemplate

样本库:

@Repository
public class JDBCDataRepositoryImpl implements JDBCDataRepository {

@Autowired
protected JdbcTemplate jdbcTemplate;
...
}
Run Code Online (Sandbox Code Playgroud)

数据jpa.jar

  • 使用the构建spring-boot-starter-data-jpa也暴露了我的应用程序也将使用的JPADataService类

示例代码:

@Service 
public class JPADataServiceImpl implements JPADataService {

@Autowired
private JPADataRepository jpaDataRepository;    
... 
}
Run Code Online (Sandbox Code Playgroud)
  • 与包 my.data.jpa
  • 没有SpringBoot主类.仅为单元测试类创建Spring配置
  • 存储库类扩展了CrudRepository接口

样本库:

@Repository
public interface JPADataRepository extends CrudRepository<MyObject, Integer{
...
}
Run Code Online (Sandbox Code Playgroud)

在我的SpringBoot项目中,我有以下SpringBoot主应用程序:

@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {
}
Run Code Online (Sandbox Code Playgroud)

在我的业务服务MainService类中,我有以下注入

@Service
public class MainServiceImpl implements MainService {

@Autowired
private JDBCDataService jdbcDataService;

@Autowired
private JPADataService jpaDataService;
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了这个问题"Could not Autowire. No beans of 'JPADataService' type found",这个问题只适用于班级,JPADataService但是对于JDBCService班级来说工作正常.

我已经尝试过以下问题中找到的解决方案,但在我的情况下这些都不起作用:

我不能@Autowire存在于依赖的Library Jar中的Bean吗?

@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"})
Run Code Online (Sandbox Code Playgroud)

我怎么能@Autowire一个从外部jar创建的spring bean?

@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}
Run Code Online (Sandbox Code Playgroud)

我现在找到了解决问题的方法.为了扫描我的数据库,我必须向上移动我的主要MyApp.java一个包级别.

而不是把我的MyApp.javamy.app包,我必须将它移到下my才能成功地扫描我的图书馆与my.data.jpamy.data.jdbc包.

Jow*_*own 12

我现在找到了解决问题的方法.为了扫描我的数据库,我必须向上移动我的主要MyApp.java一个包级别.

而不是把我的MyApp.javamy.app包,我必须将它移到下my才能成功地扫描我的图书馆与my.data.jpamy.data.jdbc包.

  • 这不是一个错误,@ComponentScan 默认情况下从定义主类及其子目录的包中获取 (2认同)

Chr*_*der 10

如果您尝试自动装配的类未使用@Component注释,则添加@ComponentScan将不起作用.为了使其工作,您必须在@Configuration类中注释一个方法.这样的事情应该允许你自动使用这个类:

@Configuration
public class ConfigClass{

    @Bean
    public JPADataService jpaDataService(){
        return new JPADataService();
    }
}
Run Code Online (Sandbox Code Playgroud)