Мое приложение Spring Boot не идентифицирует мои объекты

Я пытаюсь запустить приложение 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.

Вы случайно не используете javax.persistence.Entity вместо jakarta.persistence.Entity?

Turing85 10.06.2024 19:04

Не могли бы вы попробовать: @EnableJPARepositories(basePackages = "com.example.demo.repository") хотя, исходя из структуры вашего проекта, я не думаю, что это необходимо — но теперь мне любопытно;)

Eric 10.06.2024 19:22

Я бы попробовал добавить @EntityScan — чтобы проверить, связано ли это со сканированием объектов.

Lesiak 10.06.2024 20:49

Мне удалось запустить опубликованный вами код — очень подробно, спасибо — и приложение запустилось нормально. Согласно отдельному комментарию Turing85, вы использовали ``import jakarta.persistence.Entity;```

N Sarj 11.06.2024 12:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш этот код содержит длинный тип данных

@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 будет репозиторием, связанным с @EntityCoche, который использует первичный ключ типа 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.

user24839709 11.06.2024 19:30

Другие вопросы по теме