Daniel Lundquist
Daniel Lundquist

Reputation: 11

Field required a bean of type ... that could not be found - Error when using Springboot and Postgres

we are getting this error when we run our application. We have no idea how to fix it, we have tried many solution from other SO questions but none have worked so far.


**
APPLICATION FAILED TO START
**

Description:

Field productRepository in ntnu.no.SpringDatabaseTest.service.ProductService required a bean of type 'ntnu.no.SpringDatabaseTest.repositories.ProductRepository' that could not be found.


Action:

Consider defining a bean of type 'ntnu.no.SpringDatabaseTest.repositories.ProductRepository' in your configuration.

We are using PostGres database


Directory structure:

src/
├── main/
│   └── java/
|       ├── ntnu.no.SpringDatabaseTest/
|       |   └── Bootstrap
|       |   |   └──BootStrapData
|       |   └── Controllers
|       |   |   └──ProductController
|       |   └── model
|       |   |   └──Product
|       |   └── repositories
|       |   |   └──ProductRepository
|       |   └── service
|       |   |   └──IProductService
|       |   |   └──ProductService
|       |   └── SpringDatabaseTestApplication
└── resources/
    └── application.properties

BootStrapData.java

package ntnu.no.SpringDatabaseTest.Bootstrap;

public class BootStrapData {
}

ProductController.java

package ntnu.no.SpringDatabaseTest.Controllers;

import ntnu.no.SpringDatabaseTest.model.Product;
import ntnu.no.SpringDatabaseTest.service.ProductService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class ProductController {

    private final ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }


    @GetMapping("/showProducts")
    public String findProducts(Model model) {
        var products = (List<Product>) productService.findAll();

        model.addAttribute("products", products);

        return "showProducts";
    }

}

Product.java

package ntnu.no.SpringDatabaseTest.model;

import org.springframework.stereotype.Service;

import javax.persistence.*;

@Entity
@Table(name="products")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long productID;
    private int price;
    private String size;
    private String productCategory;
    private String productName;
    private int productAmount;

    private String productImage;

    public Product() {
    }

    @Override
    public String toString() {
        return "Product{" +
                "productID=" + productID +
                ", price=" + price +
                ", size='" + size + '\'' +
                ", productCategory='" + productCategory + '\'' +
                ", productName='" + productName + '\'' +
                ", productAmount=" + productAmount +
                ", productImage='" + productImage + '\'' +
                '}';
    }

    public Long getProductID() {
        return productID;
    }

    public void setProductID(Long productID) {
        this.productID = productID;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public String getProductCategory() {
        return productCategory;
    }

    public void setProductCategory(String productCategory) {
        this.productCategory = productCategory;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public int getProductAmount() {
        return productAmount;
    }

    public void setProductAmount(int productAmount) {
        this.productAmount = productAmount;
    }

    public String getProductImage() {
        return productImage;
    }

    public void setProductImage(String productImage) {
        this.productImage = productImage;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Product product = (Product) o;

        return productID != null ? productID.equals(product.productID) : product.productID == null;
    }

    @Override
    public int hashCode() {
        return productID != null ? productID.hashCode() : 0;
    }
}

Product Interface

package ntnu.no.SpringDatabaseTest.repositories;

import ntnu.no.SpringDatabaseTest.model.Product;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;


@Repository
public interface ProductRepository extends CrudRepository<Product, Long> {
}

ProductService Interface

package ntnu.no.SpringDatabaseTest.service;


import ntnu.no.SpringDatabaseTest.model.Product;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public interface IProductService {

    List<Product> findAll();
}

ProductService.java

package ntnu.no.SpringDatabaseTest.service;


import ntnu.no.SpringDatabaseTest.repositories.ProductRepository;
import ntnu.no.SpringDatabaseTest.model.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Business logic for products
 */
@Service
public class ProductService implements IProductService {

    @Autowired
    private ProductRepository productRepository;


    @Override
    public List<Product> findAll() {

        return (List<Product>) productRepository.findAll();
    }
}

SpringDatabaseTestApplication.java

package ntnu.no.SpringDatabaseTest;

import ntnu.no.SpringDatabaseTest.repositories.ProductRepository;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
public class SpringDatabaseTestApplication{

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

}

application.properties

spring.main.banner-mode=off
logging.level.org.springframework=ERROR

spring.jpa.hibernate.ddl-auto=none

spring.sql.init.mode=always
spring.sql.init.platform=postgres


spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>ntnu.no</groupId>
    <artifactId>SpringDatabaseTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringDatabaseTest</name>
    <description>Test project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>

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





    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Upvotes: 1

Views: 788

Answers (1)

Krik
Krik

Reputation: 405

Remove the part

exclude={DataSourceAutoConfiguration.class}

in

SpringDatabaseTestApplication.java

This is preventing the bean from being wired in.

Also please add dependency to postgres within your pom.xml

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

Upvotes: 2

Related Questions