Внедрение JpaRepository: ошибка при создании bean-компонента с именем

У меня проблема с правильным внедрением JpaRepository в поставщик данных.

Я поместил аннотацию @EnableJpaRepositories в свой EpisodiApiApplication.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> {
}

Мой поставщик базы данных в модуле 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;
}

Но я получил эту ошибку:

Ошибка создания bean-компонента с именем tvShowDatabaseProvider, определенным в ресурсе пути к классу [pl/hypeapp/episodie/configuration/dataprovider/DatabaseDataProviderConfiguration.class]: неудовлетворенная зависимость, выраженная через параметр метода tvShowDatabaseProvider 0; вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'tvShowRepository': не удалось вызвать метод инициализации; вложенным исключением является java.lang.IllegalArgumentException: не управляемый тип: класс pl.hypeapp.core.entity.tvmaze.TvShow

Весь код на github, но он неполный и может не работать из-за отсутствия классов


person Hype    schedule 05.04.2017    source источник
comment
Он говорит, что не знает о вашей сущности. Вы устанавливаете базовый пакет при использовании @EnableJpaRepositories? Если ваши объекты не находятся в подпакете вашего @Application, вам может понадобиться использовать @EntityScan   -  person alfcope    schedule 05.04.2017
comment
Можете ли вы опубликовать код для вашего класса SpiringApplication? Кроме того, покажите нам имена пакетов для этих классов, например TvShowRepository   -  person developer    schedule 05.04.2017
comment
@javaguy Я отредактировал вопрос. Вы можете посмотреть сейчас.   -  person Hype    schedule 05.04.2017


Ответы (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);
     }
}
person alfcope    schedule 05.04.2017
comment
Спасибо. Это решение работает. Также мне нужно было поместить аннотации @Id в мой класс сущности. - person Hype; 05.04.2017

Вы используете внедрение конструктора для внедрения bean-компонента TvShowRepository, а @Autowired отсутствует для конструктора вашего TvShowDatabaseProvider, поэтому вам нужно добавить его, как показано ниже:

public class TvShowDatabaseProvider implements 
             DoesTvShowExist, GetTvShowFromDatabase, 
             InsertTvShowToDatabase {

    private final TvShowRepository tvShowRepository;

    @Autowired //add this
    public TvShowDatabaseProvider(TvShowRepository tvShowRepository) {
        this.tvShowRepository = tvShowRepository;
    }
}
person developer    schedule 05.04.2017
comment
Да, вы правы, вы получите ошибку, потому что это не имеет ничего общего с @EnableJpaRepository упаковкой, потому что ваш класс Repository уже находится в списке сканирования. Итак, проблема связана с подключением bean-компонента, так что смотрите в обновленном ответе сейчас - person developer; 05.04.2017