I’m trying to run a Spring Boot Application, in where I’m trying to test the display of a list of cars on my Postgres database. The thing is that, when I try to run the app, is shutdowns inmediatly, because is not capable of "creating beans for 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]
My folder structure looks something like this, as I’m trying to follow the Repository-Service-Controller pattern
folder structure
It’s a Maven project, and I’m using Ubuntu, in case this information could help.
I’m showing you all my code to understand where the error could be in.
Coche.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 (interface):
package com.example.demo.service;
import com.example.demo.model.Coche;
public interface CocheService {
List<Coche> findAll();
}
CarServiceImpl.java (class):
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 (main):
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);
}
}
I tried changing my JPA Repo to a CRUD Repo, but nothing happened. Also, I tried @EnableJPARepositories on the main App, but also nothing happened. Furthermore, I tried to @ComponentScan, but I am not able to do so, since Spring tells me is redundanct because @SpringBootApplication already does that (I think because of some sort of auto-configuration). I’m expecting to launch the app on localhost to be able to access to an JSON array of cars when I access to http://localhost:8080/api/v1/coches
2
Answers
Your this code contains long data type
But in Entity class you have declared id_coche as int
You have declared
id_coche
asint
. This is equivalent for a primary key field in your table:Then you have declared repository
CocheRepository
that extendsJpaRepository<Coche, Long>
. You have just said something like this: "LetCocheRepository
be a repository that is associated with@Entity
Coche
which uses primary key of typeLong
" – which is simply not true.Spring tries to inject
CocheRepository
intoCarServiceImpl
, but first it needs to create an instance. Spring doesn’t know how to create an instance for this, becauseCoche
@Entity
usesint
instead ofLong
type as a primary key.Try to use below repository:
Additionally you have to modify your
Coche
class like below (JpaRepository
uses generic type parameters witch can not be a primitive one, so you need to useInteger
instead ofint
):