【问题标题】:Injecting JpaRepository: Error creating bean with name注入 JpaRepository:使用名称创建 bean 时出错
【发布时间】:2017-08-31 11:04:13
【问题描述】:

我在将 JpaRepository 正确注入数据提供者时遇到问题。

我将@EnableJpaRepositories 注释放在位于包中的EpisodieApiApplication.class 中:

包 pl.hypeapp.episodie;

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = "pl.hypeapp.episodie.configuration")
@EnableAdminServer
@EnableJpaRepositories
public class EpisodieApiApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(EpisodieApiApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    return builder.sources(EpisodieApiApplication.class);
     }
}

DatabaseDataProviderConfiguration.class 位于包中

包pl.hypeapp.episodie.configuration.dataprovider;

@Configuration
public class DatabaseDataProviderConfiguration {

   @Bean
   public TvShowDatabaseProvider tvShowDatabaseProvider(TvShowRepository tvShowRepository) {
   return new TvShowDatabaseProvider(tvShowRepository);
   }
}

TvShowRepository.class 位于包中

包 pl.hypeapp.episodie.dataproviders.database;

public interface TvShowRepository extends JpaRepository<TvShow, String> {
}

我的databaseprovider在模块application/dataproviders/database DatabaseDataProvider.class

public class TvShowDatabaseProvider implements DoesTvShowExist, GetTvShowFromDatabase, InsertTvShowToDatabase {

    private final TvShowRepository tvShowRepository;

    public TvShowDatabaseProvider(TvShowRepository tvShowRepository) {
        this.tvShowRepository = tvShowRepository;
    }
}

TvShow.class 位于包中:

包 pl.hypeapp.core.entity.tvmaze;

@JsonIgnoreProperties(ignoreUnknown = true)
@Data
@Entity
public class TvShow {

    @JsonProperty("id")
    public Integer id;
}

但是我收到了这个错误:

在类路径资源 [pl/hypeapp/episodie/configuration/dataprovider/DatabaseDataProviderConfiguration.class] 中定义名称为 'tvShowDatabaseProvider' 的 bean 创建错误:通过方法 'tvShowDatabaseProvider' 参数 0 表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“tvShowRepository”的 bean 时出错:调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException: Not a managed type: class pl.hypeapp.core.entity.tvmaze.TvShow

github 的完整代码,但不完整,可能由于缺少类而无法工作

【问题讨论】:

  • 表示它不了解您的实体。使用@EnableJpaRepositories时是否设置了基础包?如果您的实体不在@Application 的子包中,您可能需要使用@EntityScan
  • 您也可以发布SpiringApplication 课程的代码吗?另外,向我们展示这些类的包名称,例如TvShowRepository
  • @javaguy 我编辑了问题。你现在可以看。

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


【解决方案1】:

您正在使用构造函数注入来注入TvShowRepository bean,而您的TvShowDatabaseProvider 的构造函数缺少@Autowired,因此您需要添加它,如下所示:

public class TvShowDatabaseProvider implements 
             DoesTvShowExist, GetTvShowFromDatabase, 
             InsertTvShowToDatabase {

    private final TvShowRepository tvShowRepository;

    @Autowired //add this
    public TvShowDatabaseProvider(TvShowRepository tvShowRepository) {
        this.tvShowRepository = tvShowRepository;
    }
}

【讨论】:

  • 是的,你是对的,你会得到错误因为它与@EnableJpaRepository包装无关,因为你的Repository类已经在扫描列表中,所以问题出在连接 bean,所以现在看看更新的答案
【解决方案2】:

您没有扫描您的实体。您可以使用"pl.hypeapp" 作为@EnableJpaRepository 的基本包或使用@EntityScan

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = "pl.hypeapp.episodie.configuration")
@EnableAdminServer
@EnableJpaRepositories(basePackages = {"pl.hypeapp.episodie.dataproviders"})
@EntityScan(basePackages = {"pl.hypeapp.core.entity"})
public class EpisodieApiApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(EpisodieApiApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    return builder.sources(EpisodieApiApplication.class);
     }
}

【讨论】:

  • 谢谢。此解决方案有效。我还需要在我的实体类中添加@Id 注释。
猜你喜欢
  • 1970-01-01
  • 2020-02-23
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多