Нечетная Spring Boot @Autowired ошибка в хранилище НЕ из-за неправильной структуры проекта или отсутствующих аннотаций - PullRequest
0 голосов
/ 09 ноября 2019

Я задаю этот вопрос с риском пометить его как дубликат, но я, честно говоря, не думаю, что это так, вот и он.

У меняпроблема с запуском основного приложения Spring Boot. Я получаю следующую ошибку:

Параметру 0 конструктора в com.example.demo.service.EventService требуется компонент типа 'com.example.demo.dao.EventRepository', который можетне найден.

Теперь это похоже на довольно распространенную ошибку (и вопрос по SO), которая должна указывать разработчику на проверку следующих проблем:

  1. Чаще всегоструктура проекта неверна (или, скажем, 'custom'), и bean-компонент не сканируется из-за иерархии [Вопросы: это , это , это , это и, вероятно, еще много]. Решение должно состоять в том, чтобы поместить SpringBootApplication в верхний пакет и все компоненты в его подпакеты, чтобы он мог сканировать все правильно или настраивать пакеты, которые должны быть проверены.
  2. Компонент не был определен, т. Е. Отсутствует аннотация типа @Service, @Repository и т. Д., Поэтому компонент не создается.
  3. Другая причина может заключаться в использовании двух разных способов определения bean-компонентов (как указано здесь ). Я использую чисто аннотационное определение стиля, так что я думаю, что здесь должно быть хорошо.

Кроме того, этот вопрос содержит ответ, в котором упоминается исключение автоконфигурации репозиториев JPA из файла application.properties, но у меня нет этой конфигурации.

Была также пара вопросов / ответов, в которых упоминались проблемы с зависимостями, и файл pom.xml, который исправил эту проблему, но мой pom.xml - довольно простой файл, созданный из Spring Initializr, поэтому, опять же, я не думаю, что эторешение.

В сообщении об ошибке также говорится:

Рассмотрите возможность определения bean-компонента типа 'com.example.demo.dao.EventRepository' в вашей конфигурации.

В этом репозитории «пропущен бин»:

package com.example.demo.dao;

import com.example.demo.entity.Event;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EventRepository extends JpaRepository<Event, Integer> {
}

Вы можете видеть, что у него есть аннотация @Repository (хотя раньше я создавал репозитории без этой аннотации, и она работала нормально, поэтому я недумаю, что это необходимо, но я добавил это сейчас на всякий случай, если это было проблемой), он расширяет JpaRepository, поэтому он должен быть действительным хранилищем, и он находится внутри com.example.demo.dao package.

Класс, который автоматически подключается, это сервис:

package com.example.demo.service;

import com.example.demo.dao.EventRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EventService {

    EventRepository eventRepository;

    @Autowired
    public EventService(EventRepository eventRepository) {
        this.eventRepository = eventRepository;
    }
}

Я также предоставлю основное приложение, чтобы вы могли видеть его пакет com.example.demo , который является родительским пакетом как для службы, так и для хранилища:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

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

Я также пытался пересоздать проект и печально известное «закрытие и повторное открытие» IntelliJ, поскольку он был известен иногдаглупо в моем опыте, и это решило бы это, но не в этот раз.

Кроме того, как примечание, я успешно создавал подобные проекты раньше, поэтому я действительно не уверен, в чем проблема прямо сейчас.

Я что-то упускаю здесь очевидное? Что еще я могу проверить?

РЕДАКТИРОВАТЬ:

Вот также класс сущности (генерируется инструментом IDE):

package com.example.demo.entity;

import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Objects;

@Entity
public class Event {
    private int id;
    private String name;
    private Timestamp dateFrom;
    private Timestamp dateTo;

    // getters & setters abstracted
}

1 Ответ

0 голосов
/ 09 ноября 2019

Оказывается, это была проблема с pom.xml.

Я добавил зависимость JPA позже и случайно добавил неправильную. У моего pom.xml было

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
</dependency>

вместо

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Очевидно, что в инструменте IDE, используемом для создания сущностей из таблиц, отсутствовал javax.persistence, поэтому он добавил этот jar вручную через папку lib. IntelliJ все выглядело нормально, но между зависимостями что-то путалось.

В любом случае, я изменил зависимость в pom.xml и удалил добавленный дополнительный jar. Теперь все отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...