【问题标题】:Spring Boot can not enable JPA Repositories for JAR filesSpring Boot 无法为 JAR 文件启用 JPA 存储库
【发布时间】:2017-10-25 18:37:53
【问题描述】:

您好,我在第一个 maven 项目中有两个 maven 项目(不是模块)我有一个 data-jpa 存储库

用户存储库

package com.massoudafrashteh.code.spring.boot.dans.repository;
public interface UserRepository extends JpaRepository<User, Long> {}

用户服务实现

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;
}

然后将此项目导出到一个 jar 并附加到另一个启动应用程序,我在里面有这样的配置

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = "com")
@EntityScan(basePackages ="com.massoudafrashteh.code.spring.boot.dans.domain")
@EnableJpaRepositories("com.massoudafrashteh.code.spring.boot.dans.repository")
public class Config {
    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }
}    

但是 Boot 找不到我的存储库并说

考虑定义一个 bean 类型 'com.massoudafrashteh.code.spring.boot.dans.repository.UserRepository' 在你的配置中

在两个项目中都使用了“spring-boot-starter-data-jpa 1.5.3.RELEASE”。我认为问题在于我有一个用于 UserServiceImpl 的@Bean,而 spring 在运行时找不到 Data JPA 的实现!

更新1: 当我将两者都作为 Maven 模块进行测试时,它们可以工作!但它们不能作为 jar 文件工作!

更新 2: 没有其他配置,我只是使用了Spring-Boot管理数据库的HSQLDB。

Update3: 我应该使用引导项目作为依赖项。请看一下这两个项目,spring-rest-test 是可执行项目,https://gitlab.com/massoud.afrashteh/spring-boot-template。谢谢

【问题讨论】:

  • 你能显示你的 application.properties 或 yml 文件吗?
  • 两个项目中都没有application.properties
  • 您是否尝试过让存储库在第一个 maven 项目中工作?或者如果你在第二个maven项目中声明一个repository并尝试使用它,它是否有效?
  • OK 然后启动在双​​方都能正常工作,但无法加载另一个项目的东西!
  • 我刚刚尝试在模块之间的多模块项目中自动装配存储库。这与使用另一个 jar 中的存储库基本相同。我认为您的组件扫描还有其他问题。你能再做一次检查吗?你能在包“com.massoudafrashteh.code.spring.boot.dans.repository”中定义一个带有@Component注解的示例bean,看看你是否能够在UserServiceImpl中自动装配它?

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


【解决方案1】:

您的 UserServiceImpl 类已经用 @Service 注释定义,它也有一些自动装配的依赖 bean。

您为什么不将 UserServiceImpl 自动装配到您需要的类中,而不是自己创建一个新实例并使用 @Bean on 方法配置为 bean。

【讨论】:

  • 因为 Spring 无法对其进行检查,如果您检查了我的上次更新,并且正如 Spring 文档所说,当我们没有模块时,我们不能将启动应用程序用作依赖项。 docs.spring.io/spring-boot/docs/1.5.3.RELEASE/reference/…
  • 您不能将启动应用程序用作依赖项,但在您的情况下,UserServiceImpl 不是启动应用程序,它是您提到的简单 jar,任何启动应用程序/任何 spring 项目都可以使用它,如果它在类路径中。此外,当您创建 UserServiceImpl 的新实例时,它的依赖类不会通过 autowire 注入。
  • 好的,所以请克隆我的代码并检查它们,你会得到我的错误。谢谢
猜你喜欢
  • 2021-11-07
  • 2017-12-03
  • 2018-08-06
  • 1970-01-01
  • 2021-04-16
  • 2015-12-15
  • 1970-01-01
  • 2018-06-26
  • 2018-07-26
相关资源
最近更新 更多