Xem xét việc xác định bean loại 'gói' trong cấu hình của bạn [Spring-Boot]


108

Tôi nhận được lỗi sau:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.


Action:

Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.

Tôi chưa bao giờ thấy lỗi này trước đây nhưng thật kỳ lạ là @Autowire không hoạt động. Đây là cấu trúc dự án:

Giao diện ứng viên

public interface Applicant {

    TApplicant findBySSN(String ssn) throws ServletException;

    void deleteByssn(String ssn) throws ServletException;

    void createApplicant(TApplicant tApplicant) throws ServletException;

    void updateApplicant(TApplicant tApplicant) throws ServletException;

    List<TApplicant> getAllApplicants() throws ServletException;
}

Người nộp đơn

@Service
@Transactional
public class ApplicantImpl implements Applicant {

private static Log log = LogFactory.getLog(ApplicantImpl.class);

    private TApplicantRepository applicantRepo;

@Override
    public List<TApplicant> getAllApplicants() throws ServletException {

        List<TApplicant> applicantList = applicantRepo.findAll();

        return applicantList;
    }
}

Bây giờ tôi có thể chỉ Người đăng ký tự động và có thể truy cập, tuy nhiên trong trường hợp này, nó không hoạt động khi tôi gọi nó trong @RestController:

@RestController
public class RequestController extends LoggingAware {

    private Applicant applicant;

    @Autowired
    public void setApplicant(Applicant applicant){
        this.applicant = applicant;
    }

    @RequestMapping(value="/", method = RequestMethod.GET)
    public String helloWorld() {

        try {
            List<TApplicant> applicantList = applicant.getAllApplicants();

            for (TApplicant tApplicant : applicantList){
                System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
            }

            return "home";
        }
        catch (ServletException e) {
            e.printStackTrace();
        }

        return "error";
    }

}

------------------------ CẬP NHẬT 1 -----------------------

Tôi đã thêm

@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

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

}

và lỗi đã biến mất nhưng không có gì xảy ra. Tuy nhiên khi tôi nhận xét ra tất cả mọi thứ buôn bán với Applicanttrong RestControllertrước khi thêm @ComponentScan()tôi đã có thể trả về một chuỗi các UI, do đó có nghĩa là tôi RestControllerđang làm việc, bây giờ nó đã được bỏ qua. Tôi xấu xí Whitelabel Error Pagebây giờ.

--------------------- CẬP NHẬT 2 --------------------------- ---

Tôi đã thêm gói cơ bản của hạt đậu mà nó đã phàn nàn. Lỗi đọc:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.


Action:

Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.

Tôi đã thêm @ComponentScan

@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebServiceApplication.class);
    }

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

}

---------------------------- Cập nhật 3 -------------------- -

thêm:

@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {

vẫn đang phàn nàn về ApplicantImpllớp học @Autowirescủa tôi mà tôi repo TApplicantRepositoryvào đó.


Tệp ngữ cảnh ứng dụng của bạn ở đâu? Nếu bạn không có, bạn nên cân nhắc cung cấp cho Spring một số gợi ý với các chú thích như @ComponentScan để cung cấp tất cả các hạt đậu.
Mario Santini

@MarioSantini vui lòng xem bản cập nhật 1
Mike3355

Tôi giả sử sau mỗi lần cập nhật có những thay đổi về lỗi? Nếu có thể, hãy đăng cấu trúc dự án của bạn và nhật ký lỗi / stacktrace trong mỗi trường hợp .. Tốt hơn hết là bạn nên biết "Tại sao" những lỗi đó lại xảy ra, thay vì "điều gì đó" khiến lỗi biến mất. Sẽ hữu ích cho những người khác gặp phải vấn đề tương tự.
Ameen.M

Câu trả lời:


201

Có thể là do dự án đã được chia nhỏ thành các mô-đun khác nhau.

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {

5
Mát mẻ. Dự án của tôi được chia theo một số mô-đun. ComponentScan đã giải quyết được vấn đề của tôi!
kholofelo Maloma

ComponentScan chú thích giải quyết vấn đề của tôi, nhưng @EnableAutoConfiguration không
JPL

Trên thực tế, EnableAutoConfiguration định nghĩa ngầm một “gói tìm kiếm” cơ sở cho các mục nhất định và việc sử dụng gói gốc cũng cho phép sử dụng chú thích ComponentScan mà không cần chỉ định thuộc tính basePackage. Và @SpringBootApplication chú thích có thể được sử dụng nếu lớp chính của bạn là trong gói gốc
JPL

1
Giải pháp này giúp tôi với lỗi này trong phiên bản 2.0.4
manu muraleedharan

2
Có, đó là do thực tế là dự án đã được chia thành các mô-đun khác nhau. @EntityScan@EnableJpaRepositoriesvới các tên gói phù hợp đã làm việc cho tôi.
Adi Sivasankaran

51

Có một cơ hội ...
Bạn có thể bị thiếu @Service, @Repositorychú thích về các lớp triển khai tương ứng của bạn.


2
Đây phải là câu trả lời được chấp nhận, đơn giản và khắc phục được vấn đề. Cảm ơn bạn.
nightfury

1
Đã làm cho tôi. Cảm ơn.
Okafor T Kosiso

1
Cảm ơn bạn, tôi đã thiếu chú thích
@Repository

1
Vâng, đây sẽ là câu trả lời. Các câu trả lời trên chỉ đơn giản là giả định rằng quá trình quét không thành công, đó là sai.
Sumit Badsara

48

Có vẻ như lớp Ứng viên của bạn chưa được quét. Theo mặc định, tất cả các gói bắt đầu với gốc là lớp mà bạn đã đặt @SpringBootApplicationsẽ được quét.

giả sử mainlớp "WebServiceApplication" của bạn nằm trong " com.service.something", thì tất cả các thành phần nằm trong " com.service.something" sẽ được quét và " com.service.applicant" sẽ không được quét.

Bạn có thể cấu trúc lại các gói của mình sao cho "WebServiceApplication" nằm trong gói gốc và tất cả các thành phần khác trở thành một phần của gói gốc đó. Hoặc bạn có thể bao gồm @SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})vv để các thành phần "TẤT CẢ" được quét và khởi tạo trong vùng chứa mùa xuân.

Cập nhật dựa trên nhận xét

Nếu bạn có nhiều mô-đun đang được quản lý bởi maven / gradle, tất cả các nhu cầu của mùa xuân là gói để quét. Bạn yêu cầu mùa xuân quét "com.module1" và bạn có một mô-đun khác có tên gói gốc là "com.module2", những thành phần đó sẽ không được quét. Bạn thậm chí có thể yêu cầu mùa xuân quét "com" , sau đó sẽ quét tất cả các thành phần trong " com.module1." và " com.module2."


Dự án của tôi có cấu trúc là các mô-đun khác nhau. Ví dụ, các dịch vụ sẽ có mô-đun riêng của nó và build.gradle. Những build.gradletên mô-đun đó được thêm vào dependenciesmô-đun của mô-đun với phương thức chính. Vì vậy, khi bạn thấy @ComponentScan("module-service")đó là những gì tôi nghĩ sẽ hiệu quả. Tuy nhiên bên trong module-servicecó một gói. Vậy câu hỏi của tôi sẽ như thế nào? Tôi chỉ đặt tên gói hoặc tên mô-đun hoặc bằng cách nào đó cả hai?
Mike3355

Không thành vấn đề nếu các gói nằm trong các mô-đun khác nhau. Các gói trong đó các thành phần cần được quét phải được chỉ định vào mùa xuân. Bạn có thể cung cấp tất cả các tên gói "gốc" của tất cả các mô-đun của bạn trong thuộc tính "scanBasePackages" .. Và tất cả các "gói" của nó phải được đề cập, không phải mô-đun.
Ameen.M

Đã làm những gì bạn nói và lỗi đã biến mất nhưng chỉ phàn nàn về một gói khác. Tự nhiên tôi thêm nó vào danh sách nhưng nó sẽ không biến mất. Tôi đã triển khai nó như thế này:@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
Mike3355

Tôi vừa làm @SpringBootApplication(scanBasePackages= "com")và nó đang phàn nàn về kho lưu trữ JPA. Cảm ơn rât nhiều. Tôi không biết mùa xuân sẽ quét tất cả các gói bắt đầu bằng "com" nếu bạn làm như trên.
Mike3355

23

Về cơ bản, điều này xảy ra khi bạn có Ứng dụng Lớp học của mình trong "gói khác". Ví dụ:

com.server
 - Applicacion.class (<--this class have @ComponentScan)
com.server.config
 - MongoConfig.class 
com.server.repository
 - UserRepository

Tôi giải quyết vấn đề này trong Application.class

@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem

Một cách khác kém thanh lịch hơn là: đặt tất cả các lớp cấu hình trong cùng một gói.


2
Infact, bạn không cần chỉ định @ComponentScantrong trường hợp trên. Bởi vì bạn Application.class(trong đó có các @SpringBootApplicationchú thích) được đặt trong com.serverđó là anyway gốc cho cả com.server.configcũng như com.server.repository.
Ameen.M

@ Ameen.MTĐó là câu hỏi chính xác của tôi, Tại sao nó vẫn không thể giải quyết được và tại sao nó yêu cầu quét rõ ràng cho các repos mongo bằng cách sử dụng @EnableMongoRepositories?
Karthikeyan

10

Trong trường hợp của tôi, tôi đã có một sai lầm khủng khiếp. tôi đặt@Service lên giao diện dịch vụ.

Để khắc phục, tôi đã cài đặt @Servicetệp dịch vụ triển khai và nó hoạt động với tôi.


Tương tự cho tôi. Cảm ơn
Manta

7

Nếu một bean nằm trong cùng một gói với nó là @Autowosystem, thì nó sẽ không bao giờ gây ra sự cố như vậy. Tuy nhiên, không thể truy cập bean từ các gói khác nhau theo mặc định. Để khắc phục sự cố này, hãy làm theo các bước sau:

  1. Nhập nội dung sau vào lớp chính của bạn:
    import org.springframework.context.annotation.ComponentScan;
  2. thêm chú thích trên lớp chính của bạn:
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

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

5

Tôi nghĩ bạn có thể đơn giản hóa nó bằng cách chú thích kho lưu trữ của bạn với @Repository, sau đó nó sẽ được Spring Framework tự động kích hoạt.


4

Trong trường hợp của tôi, hai tùy chọn này đã hoạt động.

  1. trong //@ComponentScan ({"myapp", "myapp.resources","myapp.services"}) bao gồm cũng gói mà giữ Application.classtrong danh sách, hoặc

  2. Đơn giản chỉ cần thêm @EnableAutoConfiguration; nó tự động nhận ra tất cả các đậu mùa xuân.


3

Điều này cũng có thể xảy ra nếu bạn đang sử dụng Lombok và bạn thêm các trường @RequiredArgsConstructor@NonNullfor nhưng một số trường của bạn không được đưa vào hàm tạo. Đây chỉ là một trong những khả năng mắc cùng một lỗi.

tham số 0 yêu cầu một bean kiểu ThiếuBeanName không thể tìm thấy

Trong trường hợp của tôi, lỗi cho tôi biết vấn đề của Bộ điều khiển là gì, sau khi xóa @NonNullứng dụng bắt đầu tốt


3

Tôi đã gặp phải vấn đề quen thuộc trong dự án đa mô-đun Maven của mình với Spring Boot 2. Vấn đề liên quan đến việc đặt tên cho các gói của tôi trong các mô-đun Maven con.

@SpringBootApplication đóng gói rất nhiều thành phần như - @ComponentScan, @EnableAutoConfiguration, jpa-repositories, json-serialization, v.v. Và anh ấy đặt @ComponentScan trong gói không gian com. *******.. Phần này của gói com. *******. Không gian phải chung cho tất cả các mô-đun.

Để sửa nó:

  1. Bạn nên đổi tên tất cả các gói mô-đun. Các từ khác bạn phải có trong tất cả các gói trong tất cả các mô-đun Maven - cùng một phần mẹ. Ví dụ - com. *******. Dấu cách
  2. Ngoài ra, bạn phải di chuyển điểm vào của mình đến gói này - không gian com. *******.

2

Tôi đã tìm kiếm trực tuyến để tìm câu trả lời nhưng có vẻ như không có giải pháp thích hợp nào cho trường hợp của tôi: Ngay từ đầu, mọi thứ hoạt động tốt như sau:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

Sau đó, tôi đang cố gắng thêm một bản đồ để lưu vào bộ nhớ cache một thứ gì đó và nó trở thành như sau:

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

Bùm!

Description:

Parameter 4 of constructor in *.GroupService required a bean of type 'java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

Tôi đã loại bỏ @AllArgsConstructor(onConstructor = @__(@Autowired))và thêm @Autowiredcho mỗi repositoryservicengoại trừ Map<String, String>. Nó chỉ hoạt động như trước đây.

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

Hy vọng điều này có thể hữu ích.


2

Nó hoạt động với tôi sau khi thêm chú thích bên dưới trong ứng dụng:

@ComponentScan({"com.seic.deliveryautomation.mapper"})

Tôi gặp lỗi dưới đây:

"tham số 1 của hàm tạo trong yêu cầu trình ánh xạ kiểu bean không thể tìm thấy:



2

Bạn cũng sẽ gặp lỗi này nếu bạn vô tình xác định cùng một bean trong hai lớp khác nhau. Điều đó đã xảy ra với tôi. Thông báo lỗi đã gây hiểu lầm. Khi tôi loại bỏ hạt đậu thừa, sự cố đã được giải quyết.


1
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

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

1

Điều này có thể xảy ra nếu lớp @Service được đánh dấu là trừu tượng.


1

Nếu sự phụ thuộc vào lớp của bạn đang được Spring quản lý thì sự cố này có thể xảy ra nếu chúng ta quên thêm hàm tạo đối số mặc định / trống vào bên trong lớp POJO của chúng ta.


1

Nó có thể giúp ai đó. Tôi đã gặp cùng một vấn đề, cùng một thông báo lỗi, mọi thứ giống nhau. Tôi đã thử các giải pháp từ các câu trả lời khác, không giúp được gì cho đến khi tôi nhận ra rằng bean tôi đang sử dụng có cùng tên với loại thực sự được tự động tải. Nó xảy ra ở giữa refactor, do đó tôi phải đổi tên lớp, kết quả là tích cực. Chúc mừng


1

Tôi phải đối mặt với cùng một vấn đề. Kho lưu trữ Mongo DB đã được xác định bởi Spring boot, nhưng nó không tạo Bean cho một giao diện kho lưu trữ mở rộng kho lưu trữ mongo.

Vấn đề trong trường hợp của tôi là thông số phiên bản không chính xác trong maven pom cho "mùa xuân + xoài". Tôi đã thay đổi id nhóm của hiện vật và tất cả đều hoạt động như ma thuật. không cần chú thích vì khởi động mùa xuân đã xử lý mọi thứ.

Trong quá trình giải quyết vấn đề của mình, tôi đã tìm kiếm các giải pháp trên web và nhận ra rằng vấn đề này thực sự liên quan đến cấu hình dự án, bất kỳ ai gặp vấn đề này trước tiên nên kiểm tra thiết lập dự án của họ và bật gỡ lỗi từ mùa xuân để biết thêm chi tiết về lỗi và chú ý đến chính xác là trong quá trình này, quá trình tạo không thành công.


0

Trong trường hợp của tôi, lỗi này xuất hiện vì quá trình nhập của tôi bị sai, ví dụ: sử dụng spring, quá trình nhập tự động xuất hiện:

import org.jvnet.hk2.annotations.Service;

nhưng tôi cần:

import org.springframework.stereotype.Service;

0

Tôi gặp trường hợp cần đưa RestTemplate vào một lớp dịch vụ. Tuy nhiên, lớp dịch vụ không thể chọn RestTemplate. Những gì tôi đã làm là tạo một lớp trình bao bọc trong cùng một gói với ứng dụng chính và đánh dấu trình bao bọc là Thành phần và tự động truyền tải thành phần này trong lớp dịch vụ. Vấn đề đã được giải quyết. hy vọng nó cũng hiệu quả với bạn


0

Lỗi của tôi là tôi đã bao gồm:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

thay vì:

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

0

Tôi nghĩ, bạn đang thiếu chú thích @Bean trong RequestController của mình

Thêm Bean vào tệp của bạn, điều này đã giải quyết được vấn đề của
tôi. Tôi đã nhận được giải pháp này khi đang học Spring Boot từ hướng dẫn

private Applicant applicant;

@Bean 
public Applicant applicant() { 
    return new Applicant(); 
}

0

Thêm phần phụ thuộc vào Spring Boot Data JPA Starter đã giải quyết được vấn đề cho tôi.

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

Gradle

compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.2.6.RELEASE'

Hoặc bạn có thể truy cập trực tiếp tại đây


Điều này thực sự không áp dụng trong trường hợp này. Nó nhắc về chi tiết kết nối với cơ sở dữ liệu (Không thể định cấu hình DataSource: thuộc tính 'url' không được chỉ định và không thể định cấu hình nguồn dữ liệu nhúng.). Trong tình huống tôi muốn kiểm tra thủ công mà không tương tác với cơ sở dữ liệu, điều này sẽ không hoạt động.
Thomas Okonkwo

0

Nếu bạn sử dụng, interfacebạn có thể mở rộng CrudRepository<Applicant,Long>với @Repositorychú thích.


0

Vấn đề cũng có thể xuất hiện khi bạn sử dụng mỗi ví dụ @EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE) và sau đó bạn đổi tên gói hoặc chuyển nó sang một nơi khác.

Rất thường xuyên phải đối mặt với nó trong một dự án maven nhiều mô-đun và khởi động mùa xuân


0

Có khả năng là bạn đang cố gắng @autowred một giao diện trước khi triển khai giao diện.

giải pháp ví dụ:

    **HomeController.java**
    class HomeController{

      @Autowired
      UserService userService;
    .....
    }
----------------------------------------------------------------------
    **UserService.java** 
    public interface UserService {
        User findByUsername(String username);
    .....
    }
-----------------------------------------------------------------------
     **UserServiceImpl.java**
     @Service
     public class UserServiceImpl implements UserService{

         public User findByUsername(String username) {
           return userDao.findByUsername(username);
         }
        ....
      }

<i>This is not italic</i>, and [this is not a link](https://example.com)

0

Xóa cấu hình loại chú thích như @Service khỏi phương thức chạy chuỗi.

@Service, @Component

0

Hãy thử định cấu hình cấu trúc dự án như bên dưới:

Đặt tất cả repo, dịch vụ, gói vào gói con của gói chính:

package com.leisure.moviemax;  //Parent package
        
@SpringBootApplication
@PropertySource(value={"classpath:conf.properties"})
    
public class MoviemaxApplication implements CommandLineRunner {
        
package com.leisure.moviemax.repo; //child package

@Repository
public interface UsrRepository extends JpaRepository<UserEntity,String> {

0

nhắc nhở rằng mùa xuân không quét thế giới, nó sử dụng chức năng quét nhắm mục tiêu nghĩa là mọi thứ trong gói nơi ứng dụng springboot được lưu trữ. do đó lỗi này "Cân nhắc xác định bean loại 'gói' trong cấu hình của bạn [Spring-Boot]" có thể xuất hiện vì bạn có các giao diện dịch vụ trong một gói ứng dụng springbootapplication khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.