Reputation: 11
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
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