Hello and welcome to another blog post. Today we are going to take a look at one of the most frequently appearing errors in the Spring Boot application. I’m sure most of us have faced a similar issue while working with the Spring Boot application, and the error is ‘consider defining a bean of type package in your configuration’. In general, The error "Consider defining a bean of type 'package' in your configuration" occurs when Spring Boot is unable to find a bean of a specific type that is required by your application. In this article, we will take an in-depth look at why this error appears in the first place. Moving ahead we will learn how to fix this issue. So without further ado let’s jump into it.
How to fix "Consider defining a bean of type 'package' in your configuration"
As I said, the error "Consider defining a bean of type 'package' in your configuration" occurs when Spring Boot is unable to find a bean of a specific type that is required by your application.1. Check the class name
2. Check the package name
3. Add the missing bean
4. Use component scanning
5. Check dependencies
6. Restart your application
By following these steps, you should be able to resolve the "Consider defining a bean of type 'package' in your configuration" error and successfully start your Spring Boot application. For better understanding, I will show you how to solve this error with the help of an example. Below are the classes in my simple Spring Boot project.
SpringBootPracticeApplication.java
package com.practice.springboot.main;
import com.practice.springboot.entity.Employee;
import com.practice.springboot.repo.EmployeeRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootPracticeApplication implements CommandLineRunner {
@Autowired
EmployeeRepo employeeRepo;
public static void main(String[] args) {
SpringApplication.run(SpringBootPracticeApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
Employee employee = new Employee();
employee.setName("John");
employee.setAge(25);
employee.setSalary(10000);
employee.setQualification("BE");
// SAVE THE EMPLOYEE
employeeRepo.save(employee); // This will through an error
}
}
Employee.java
package com.practice.springboot.entity;
import jakarta.persistence.*;
import lombok.Data;
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
private int age;
private double salary;
private String qualification;
}
EmployeeController.java
package com.practice.springboot.controller;
import com.practice.springboot.repo.EmployeeRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1")
public class EmployeeController {
@Autowired
EmployeeRepo employeeRepo;
@RequestMapping(value = "/employees", method = RequestMethod.GET)
public ResponseEntity<?> getEmployees(){
return new ResponseEntity<>(employeeRepo.findAll(), HttpStatus.OK);
}
}
EmployeeRepo.java
package com.practice.springboot.repo;
import com.practice.springboot.entity.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
public interface EmployeeRepo extends JpaRepository<Employee,Integer> {
}
Here is our application’s directory structure.
├── main
│ ├── java
│ │ └── com
│ │ └── practice
│ │ └── springboot
│ │ ├── controller
│ │ │ └── EmployeeController.java
│ │ ├── entity
│ │ │ └── Employee.java
│ │ ├── main
│ │ │ └── SpringBootPracticeApplication.java
│ │ ├── repo
│ │ │ └── EmployeeRepo.java
│ │ └── service
│ └── resources
│ ├── application.properties
│ ├── static
│ └── templates
└── test
└── java
└── com
└── practice
└── springboot
└── SpringBootPracticeApplicationTests.java
When we run our main application, the following results will appear in the console window.
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.0.4)
2023-03-09T15:29:17.410+05:00 INFO 45556 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 16 ms. Found 0 JPA repository interfaces.
2023-03-09T15:29:17.812+05:00 INFO 45556 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
2023-03-09T15:29:18.448+05:00 INFO 45556 --- [ main] SQL dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
2023-03-09T15:29:18.729+05:00 INFO 45556 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2023-03-09T15:29:18.738+05:00 INFO 45556 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
***************************
APPLICATION FAILED TO START
***************************
Description:
Field employeeRepo in com.practice.springboot.main.SpringBootPracticeApplication required a bean of type 'com.practice.springboot.repo.EmployeeRepo' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.practice.springboot.repo.EmployeeRepo' in your configuration.
Why this error - Consider defining a bean of type 'package' in your configuration?
It is clear from the above error, that Spring Boot couldn’t find a bean of type EmployeeRepo (employee repository) inside the main application. The above error is obvious because our application’s main class is part of a sub-package.
Whereas, Spring Boot by default scans for entities, repositories, and controllers as long as they are part of the same package or its child package. Therefore, it couldn’t recognize the entities, repositories, and controllers.
For example, there could be a typo as shown in this example:
How to fix Consider defining a bean of type 'package' in your configuration?
After recognizing the underlying problem, now it’s time to solve this issue. There exist a couple of possible solutions. A few of them are listed below:
Move the entity, controller, and repository classes into the main package (the one containing Spring Boot's main class).
Rename the package containing the main class (make it the root of the project).
Explicitly scan the entity, controller, and repository packages using @EntityScan, @EnableJpaRepositories, and @ComponentScan annotation respectively.
Solution 1:
Updating the main class SpringBootPracticeApplication
@SpringBootApplication
@EntityScan("com.practice.springboot.entity")
@EnableJpaRepositories("com.practice.springboot.repo")
@ComponentScan("com.practice.springboot.controller")
public class SpringBootPracticeApplication implements CommandLineRunner {
@Autowired
EmployeeRepo employeeRepo;
public static void main(String[] args) {
SpringApplication.run(SpringBootPracticeApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
Employee employee = new Employee();
employee.setName("Muhammad");
employee.setAge(25);
employee.setSalary(10000);
employee.setQualification("BE");
// SAVE THE EMPLOYEE
employeeRepo.save(employee); // This will through an error
}
}
Solution 2: Main application at root package of your project.
├── main
│ ├── java
│ │ └── com
│ │ └── practice
│ │ └── springboot
│ │ ├── controller
│ │ │ └── EmployeeController.java
│ │ ├── entity
│ │ │ └── Employee.java
│ │ ├── repo
│ │ │ └── EmployeeRepo.java
│ │ ├── service
│ │ └── SpringBootPracticeApplication.java
│ └── resources
│ ├── application.properties
│ ├── static
│ └── templates
└── test
└── java
└── com
└── practice
└── springboot
└── SpringBootPracticeApplicationTests.java
After following the above instructions, the application started as expected. Below is the confirmation from tomcat (embedded server).
2023-03-09T20:17:49.626+05:00
INFO 51304 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '
Conclusion
The article has finally come to a close. We have concentrated on the spring boot error "consider defining a bean of type package in your configuration". In this short article, we began the discussion by comprehending the root cause of the mistake. Here, we discuss potential mistakes and a few fixes for them. I hope you will find this essay to be useful.
thnaks
ReplyDeleteI have the same problem but because an @Inject annotation that seems to be unrecognized
ReplyDelete