SpringBoot:不能从其他Jar库自动装配类

时间:2016-08-05 13:20:18

标签: java jdbc spring-boot spring-data spring-data-jpa

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

  

数据-了jdbc.jar

  • 使用spring-boot-starter-jdbc构建,它公开了我的应用程序将使用的JDBCDataService类

示例代码:

@Service 
public class JDBCDataServiceImpl implements JDBCDataService {

@Autowired
private JDBCDataRepository jdbcDataRepository;    
... 
}
  • my.data.jdbc
  • 没有SpringBoot主类。仅为单元测试类创建的Spring配置
  • 存储库类正在使用JDBCTemplate

示例存储库:

@Repository
public class JDBCDataRepositoryImpl implements JDBCDataRepository {

@Autowired
protected JdbcTemplate jdbcTemplate;
...
}
  

数据jpa.jar

  • 使用spring-boot-starter-data-jpa构建,它还公开了我的应用程序也将使用的JPADataService类

示例代码:

@Service 
public class JPADataServiceImpl implements JPADataService {

@Autowired
private JPADataRepository jpaDataRepository;    
... 
}
  • my.data.jpa
  • 没有SpringBoot主类。仅为单元测试类创建的Spring配置
  • 存储库类扩展了CrudRepository接口

示例存储库:

@Repository
public interface JPADataRepository extends CrudRepository<MyObject, Integer{
...
}

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

@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {
}

在我的商务服务MainService课程中,我有以下注意事项

@Service
public class MainServiceImpl implements MainService {

@Autowired
private JDBCDataService jdbcDataService;

@Autowired
private JPADataService jpaDataService;

但是,我遇到了问题"Could not Autowire. No beans of 'JPADataService' type found",该问题仅适用于班级JPADataService,但适用于JDBCService班级。

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

Can't I @Autowire a Bean which is present in a dependent Library Jar?

@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"})

How can I @Autowire a spring bean that was created from an external jar?

@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}

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

我不得不将MyApp.java放在my.app包下,而是将其移至my下,以便使用my.data.jpamy.data.jdbc成功扫描我的库包。

4 个答案:

答案 0 :(得分:8)

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

我不得不将MyApp.java放在my.app包下,而是将其移至my下,以便使用my.data.jpamy.data.jdbc成功扫描我的库包。

答案 1 :(得分:6)

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

@Configuration
public class ConfigClass{

    @Bean
    public JPADataService jpaDataService(){
        return new JPADataService();
    }
}

答案 2 :(得分:1)

您需要在外部jar上配置spring.factories

external-jar-project
   |--java
   |--resources
        |-- META-INF
              |-- spring.factories

spring.factoires的接触点,像这样:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=xxx

答案 3 :(得分:-3)

这个问题同样也造成了我很久。我发现是应为springboot不能扫面到你约会的jar包路径下的相关类。

你可能需要使用类似@EnableJpaRepositories(“ cn.XXX”)@EntityScan(“ cn.XXX”)这样的注解来加载你的类(此问题也困扰了我很长时间。我发现的是springboot无法扫描您引入的jar包路径下的相关类。

您可能需要使用@EnableJpaRepositories(“ cn.XXX”)@EntityScan(“ cn.XXX”)之类的注释来扫描您的类)

希望对看到这个问题的人有帮助(希望对看到此问题的工程师有所帮助)