UnsatisfiedDependencyException JpaRepositories

Я пишу пример репозитория jpa и получаю исключение времени выполнения типа UnsatisfiedDependencyException.

Вот моя программа:

@Configuration
@EnableJpaRepositories(basePackageClasses = { PersonRepository.class, ProfessionRepository.class})
@ComponentScan( basePackageClasses =MyService.class)
public class SpringDataJpa  {
        public static void main( String[] args ) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringDataJpa.class);
        service myService = applicationContext.getBean(MyService.class);
    }
}

Интерфейс сервиса:

public interface service {
    void add( Person person );
    List<Person> getListOfPersons();
}

Реализация, выбрасывающая исключение:

@Service
public class MyService implements service {

    @Autowired
    PersonRepository personRepository;

    @Override
    public void add( Person person ){
        System.out.println("saved");
    }
    @Override
    public List<Person> getListOfPersons() {
        return  null;
    }
}

Репозитории:

@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {

}
@Repository
public interface ProfessionRepository extends JpaRepository<Profession, Integer> {

}

Исключение, которое я получаю:

Исключение в потоке «основной» org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка при создании bean-компонента с именем «myService»: неудовлетворенная зависимость, выраженная через поле «personRepository»; вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем «personRepository»: сбой постобработки определения объединенного компонента; вложенным исключением является java.lang.NoClassDefFoundError: javax/persistence/SynchronizationType

Когда я проверил это обсуждение, я добавил предложенные зависимости. Мои зависимости в файле pom.xml:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>LATEST</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>LATEST</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.4</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>LATEST</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.1.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.9.4</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>LATEST</version>
    </dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>LATEST</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>LATEST</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.197</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.1.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>javax.persistence-api</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.0-api</artifactId>
    <version>1.0.1.Final</version>
</dependency>

How to solve this error?

Мой второй вопрос: должны ли мы использовать @EnableJpaRepositories, если мы используем Spring Boot?


person xmen-5    schedule 07.07.2019    source источник
comment
Вы смешиваете несовместимые версии вместе. Например, некоторые весенние версии имеют ПОСЛЕДНЮЮ версию, другие — 5.1.7.RELEASE, третьи — 5.1.5.RELEASE. Не. И не используйте устаревший hibernate-jpa-2.0-api, который является старой версией javax.persistence-api.   -  person JB Nizet    schedule 07.07.2019
comment
@JBNizet Я исправил свои файлы pom с помощью последней версии для всех зависимостей spring, я удалил зависимость hibertnate. Но проблема та же.   -  person xmen-5    schedule 07.07.2019
comment
Я знаю, что могу использовать весеннюю загрузку, чтобы упростить управление зависимостями, но в целях обучения я сам пишу зависимости.   -  person xmen-5    schedule 07.07.2019
comment
Класс SynchronizationType является частью зависимости javax.persistence-api. Поэтому я не понимаю, как у вас может быть это исключение, если у вас действительно есть этот файл jar в вашем пути к классам во время выполнения.   -  person JB Nizet    schedule 07.07.2019
comment
просто чтобы быть точным, когда я исправил свой файл pom.xml, я получаю java.lang.NoSuchMethodError: javax.persistence.PersistenceContext.synchronization()Ljavax/persistence/SynchronizationType;   -  person xmen-5    schedule 07.07.2019
comment
Это означает, что у вас все еще есть старая версия JPA API в вашем пути к классам среды выполнения, скрывающая самую новую.   -  person JB Nizet    schedule 07.07.2019
comment
@JBNizet я забыл создать экземпляр источника данных и bean-компонента entitymagerfactory. Я думал, что без этих компонентов мы можем, по крайней мере, внедрить репозиторий jpa в сервисный компонент.   -  person xmen-5    schedule 07.07.2019


Ответы (2)


источник данных и bean-компоненты entityManagerFactory отсутствовали. Чтобы решить мою проблему, я добавил следующий код в свой класс конфигурации:

    @Bean
    public DataSource firstDataSource (){
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/ride_tracker?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC");
        driverManagerDataSource.setUsername("root");
        driverManagerDataSource.setPassword("password");
        return driverManagerDataSource;
    }

    @Bean
    LocalContainerEntityManagerFactoryBean entityManagerFactory( DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        entityManagerFactoryBean.setPackagesToScan("data");
        Properties jpaProperties = new Properties();
        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        entityManagerFactoryBean.setJpaProperties(jpaProperties);
        return entityManagerFactoryBean;
    }
person xmen-5    schedule 07.07.2019

Вы можете попробовать следующую версию, SynchronizationType доступен с версии 2.1.

<dependency>
      <groupId>org.hibernate.javax.persistence</groupId>
      <artifactId>hibernate-jpa-2.1-api</artifactId>
      <version>1.0.0.Final</version>
</dependency>
person chaitzD    schedule 07.07.2019