Я пытаюсь запустить приложение Spring Boot, в котором пытаюсь проверить отображение списка автомобилей в моей базе данных Postgres. Дело в том, что когда я пытаюсь запустить приложение, оно сразу же отключается, поскольку не может «создать bean-компоненты для CocheRepository/CocheService».
2024-06-10T18:41:07.079+02:00 DEBUG 38442 --- [Rental-Car] [ main] o.s.d.r.c.s.RepositoryFactorySupport : Initializing repository instance for com.example.demo.repository.CocheRepository…
2024-06-10T18:41:07.091+02:00 WARN 38442 --- [Rental-Car] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cocheController': Unsatisfied dependency expressed through field 'carService': Error creating bean with name 'carServiceImpl': Unsatisfied dependency expressed through field 'repository': Error creating bean with name 'cocheRepository' defined in com.example.demo.repository.CocheRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Not a managed type: class com.example.demo.model.Coche
2024-06-10T18:41:07.091+02:00 INFO 38442 --- [Rental-Car] [ main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2024-06-10T18:41:07.093+02:00 INFO 38442 --- [Rental-Car] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2024-06-10T18:41:09.257+02:00 INFO 38442 --- [Rental-Car] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
2024-06-10T18:41:09.259+02:00 INFO 38442 --- [Rental-Car] [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
Моя структура папок выглядит примерно так, поскольку я пытаюсь следовать шаблону Repository-Service-Controller. структура папок
Это проект Maven, и я использую Ubuntu, на случай, если эта информация может помочь. Я показываю вам весь свой код, чтобы понять, где может быть ошибка.
Коче.java:
package com.example.demo.model;
@Entity
public class Coche {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id_coche;
private String modelo;
private String detalles;
private double precio;
private String imagen;
public Coche() {
}
public Coche(String modelo, String detalles, double precio, String imagen) {
this.modelo = modelo;
this.detalles = detalles;
this.precio = precio;
this.imagen = imagen;
}
//getters and setters
}
CocheRepository.java:
package com.example.demo.repository;
@Repository
public interface CocheRepository extends JpaRepository<Coche, Long> {
@Override
List<Coche> findAll(Sort sort);
}
CocheService.java (интерфейс):
package com.example.demo.service;
import com.example.demo.model.Coche;
public interface CocheService {
List<Coche> findAll();
}
CarServiceImpl.java (класс):
package com.example.demo.service;
import com.example.demo.model.Coche;
import com.example.demo.repository.CocheRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CarServiceImpl implements CocheService {
@Autowired
private CocheRepository repository;
@Override
public List<Coche> findAll() {
return repository.findAll();
}
}
RentalCarApplication.java (основной):
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
public class RentalCarApplication {
public static void main(String[] args) {
SpringApplication.run(RentalCarApplication.class, args);
}
}
Я попытался изменить свой репозиторий JPA на репозиторий CRUD, но ничего не произошло. Кроме того, я попробовал @EnableJPARepositories в главном приложении, но тоже ничего не произошло. Кроме того, я попытался @ComponentScan, но не смог этого сделать, поскольку Spring говорит мне, что это избыточно, потому что @SpringBootApplication уже делает это (я думаю, из-за какой-то автоматической настройки). Я планирую запустить приложение на локальном хосте, чтобы иметь доступ к массиву автомобилей JSON при доступе к http://localhost:8080/api/v1/coches.
Не могли бы вы попробовать: @EnableJPARepositories(basePackages = "com.example.demo.repository")
хотя, исходя из структуры вашего проекта, я не думаю, что это необходимо — но теперь мне любопытно;)
Я бы попробовал добавить @EntityScan
— чтобы проверить, связано ли это со сканированием объектов.
Мне удалось запустить опубликованный вами код — очень подробно, спасибо — и приложение запустилось нормально. Согласно отдельному комментарию Turing85, вы использовали ``import jakarta.persistence.Entity;```
Ваш этот код содержит длинный тип данных
@Repository
public interface CocheRepository extends JpaRepository<Coche, Long> {
@Override
List<Coche> findAll(Sort sort);
}
Но в классе Entity вы объявили id_coche как int.
Вы объявили id_coche
как int
. Это эквивалентно полю первичного ключа в вашей таблице:
@Entity
public class Coche {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id_coche;
// (...)
}
Затем вы объявили репозиторий CocheRepository
, который расширяется JpaRepository<Coche, Long>
. Вы только что сказали что-то вроде этого: «Пусть CocheRepository
будет репозиторием, связанным с @Entity
Coche
, который использует первичный ключ типа Long
» — что просто неверно.
Spring пытается внедрить CocheRepository
в CarServiceImpl
, но сначала ему необходимо создать экземпляр. Spring не знает, как создать для этого экземпляр, потому что Coche
@Entity
использует int
вместо Long
типа в качестве первичного ключа.
Попробуйте использовать репозиторий ниже:
@Repository
public interface CocheRepository extends JpaRepository<Coche, Integer> {
@Override
List<Coche> findAll(Sort sort);
}
Кроме того, вам необходимо изменить свой класс Coche
, как показано ниже (JpaRepository
использует параметры общего типа, которые не могут быть примитивными, поэтому вам нужно использовать Integer
вместо int
):
@Entity
public class Coche {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id_coche;
// (...)
}
спасибо, чувак, я поменял его, и теперь он работает правильно. Но также настоящая проблема заключалась в использовании javax.persistance вместо jakarta.persistance.
Вы случайно не используете
javax.persistence.Entity
вместоjakarta.persistence.Entity
?