繁体   English   中英

Spring-Boot/JPA:包和实体的问题

[英]Spring-Boot/JPA: Problem with packages and Entities

我有一个带有组件和预定功能的 Spring-Boot 应用程序。

package My.A;

@SpringBootApplication
@EnableScheduling
public class MyApp 
{
    public static void main (String args []) throws Exception
    {
      SpringApplication.run (MyApp.class, args);    
    }
}

组件:

package My.A;

@Component
public class MyComp
{   

  @Scheduled (fixedRate = 3000)
  public void foo ()
  {
    System.out.println ("foo");
  }
}

一切都很好,我每 3 秒打印一次“foo”。

现在我想添加 JPA。 这不是我第一次使用 JPA。

但这是我第一次将实体放在另一个包(My.B)中。

package My.B;

@Entity
@SequenceGenerator (name = "seq", initialValue = 1)
public class MyRecord
{ 
....

我在 App 中添加了一个存储库来访问数据库。

package My.A;

public interface MyRecordRepo extends CrudRepository <MyRecord, Long> 
{
}

并且我添加了注释让 MyApp 找到 My.B 的 MyRecord。

package My.A;

@SpringBootApplication
@EnableScheduling
@EnableJpaRepositories ("My.B.*")                    // NEW
@ComponentScan (basePackages = { "My.B.*" })         // NEW

public class WebApplication 
{
...

没有那个 MyApp 会在开始时抛出一个异常,即找不到实体。 使用注释,它可以编译并正常启动。

但是现在我的预定函数 foo 没有被解雇。 我尝试将 My.A.* 添加到 ComponentScan 中,但没有成功。

@ComponentScan (basePackages = { "My.B.*", "My.A.*" })   

Think MyApp 现在找不到自己的组件。

我怎样才能让我的 scheudled 函数回来,并且在我的主包之外还有 JPA 类?

@EntityScan("My.B")添加到您的配置中。

当您使用@ComponentScan时,它会禁用 Spring Boot 自动配置扫描,您必须手动指定所有使用的包。

此外,您不需要@EnableJpaRepositories - 如果 Spring Boot 在类路径上找到 Spring Data JPA,它会自动执行此操作。

不需要 .* 组件扫描的工作方式是,如果您只定义

@ComponentScan (basePackages = { "My" }) 

它将深入到它的所有子文件夹,其中包括 A 和 B 包。

但是如果你想限制你的扫描到特定的包,那么你可以写

@ComponentScan (basePackages = { "My.B", "My.A" }) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM