2015-12-19 17 views
10

Tôi có một ứng dụng khởi động Spring.Khởi động mùa xuân @autowired không hoạt động, các lớp học trong gói khác nhau

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

org.springframework.beans.factory.BeanCreationException: Lỗi tạo đậu với tên 'birthdayController': Tiêm autowired phụ thuộc thất bại; ngoại lệ lồng nhau là org.springframework.beans.factory.BeanCreationException: Không thể trường autowire: private com.esri.birthdays.dao.BirthdayRepository com.esri.birthdays.controller.BirthdayController.repository; lồng nhau ngoại lệ là org.springframework.beans.factory.NoSuchBeanDefinitionException: Không đậu vòng loại [com.esri.birthdays.dao.BirthdayRepository] tìm thấy cho sự phụ thuộc: dự kiến ​​ít nhất 1 đậu mà đủ điều kiện như ứng cử viên autowire cho điều này phụ thuộc. Chú thích phụ thuộc: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} tại org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcessor.java:334) ~ [spring- beans-4.2.4.RELEASE.jar: 4.2.4.RELEASE] tại org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1214) ~ [spring-beans-4.2.4.RELEASE .jar: 4.2.4.RELEASE] tại org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java WEBC43) ~ [spring-beans-4.2.4.RELEASE.jar: 4.2.4. PHÁT HÀNH] tại org.springframework.beans.factory.support.AbstractAutowir eCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:482) ~ [spring-beans-4.2.4.RELEASE.jar: 4.2.4.RELEASE] tại org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory. java: 306) ~ [mùa xuân-đậu-4.2.4.RELEASE.jar: 4.2.4.RELEASE] tại hoặc

Sau đây là mã của lớp Repository tôi

package com.esri.birthdays.dao; 
import com.esri.birthdays.model.BirthDay; 
public interface BirthdayRepository extends MongoRepository<BirthDay,String> { 
    public BirthDay findByFirstName(String firstName); 
} 

Sau đây là điều khiển.

package com.esri.birthdays.controller; 
@RestController 
public class BirthdayController { 

    @Autowired 
    private BirthdayRepository repository; 

Hoạt động nếu chúng ở cùng một gói. Không chắc chắn lý do tại sao

+0

Lớp học chính của bạn là gì? Quét thành phần của nó có bao gồm cả gói lưu trữ và bộ điều khiển không? –

Trả lời

1

Hãy thử chú thích Lớp cấu hình của bạn với chú thích @ComponentScan("com.esri.birthdays"). Nói chung: Nếu bạn có các gói phụ trong dự án của mình, thì bạn phải quét các lớp liên quan của mình trên dự án gốc. Tôi đoán cho trường hợp của bạn nó sẽ là "com.esri.birthdays". Bạn sẽ không cần ComponentScan nếu bạn không có gói phụ trong dự án của mình.

0

Hãy thử điều này:

@Repository 
    @Qualifier("birthdayRepository") 
    public interface BirthdayRepository extends MongoRepository<BirthDay,String> { 
     public BirthDay findByFirstName(String firstName); 
    } 

Và khi tiêm đậu:

@Autowired 
    @Qualifier("birthdayRepository") 
    private BirthdayRepository repository; 

Nếu không, kiểm tra của bạn CoponentScan trong cấu hình của bạn.

35

Khi bạn sử dụng @SpringBootApplication chú thích trong ví dụ gói

com.company.config

nó sẽ tự động làm cho thành phần quét như thế này:

@ComponentScan("com.company.config") 

Vì vậy, nó sẽ KHÔNG quét các gói như com.company.controller vv .. Đó là lý do tại sao bạn phải khai báo @SpringBootApplication của bạn trong gói một mức trước khi norma của bạn gói l như thế này: com.company HOẶC sử dụng scanBasePackages tài sản, như thế này:

@SpringBootApplication(scanBasePackages = { "com.company" }) 

HOẶC componentScan:

@SpringBootApplication 
@ComponentScan("com.company") 


2

Xuân Boot sẽ xử lý những kho tự động chừng nào họ được bao gồm trong cùng một gói (hoặc một gói con) của lớp @SpringBootApplication của bạn. Để kiểm soát nhiều hơn quá trình đăng ký, bạn có thể sử dụng chú thích @EnableMongoRepositories. spring.io guides

@SpringBootApplication 
@EnableMongoRepositories(basePackages = {"RepositoryPackage"}) 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 
3

Chỉ cần đặt các gói bên trong thẻ @SpringBootApplication.

@SpringBootApplication(scanBasePackages = { "com.pkg1", "com.pkg2", .....}) 

Hãy cho tôi biết.

2

Đối với loại sự cố này, tôi đã kết thúc bằng cách đặt chú thích @Service vào lớp dịch vụ mới được tạo sau đó tự động được chọn. Vì vậy, hãy thử kiểm tra những lớp không nhận được tự động, nếu chúng cần chú thích được yêu cầu tương ứng (như @Controller, @Service, v.v.) áp dụng cho chúng và sau đó thử xây dựng lại dự án.

1

Trong trường hợp của tôi @component không hoạt động vì tôi đã khởi tạo phiên bản lớp đó bằng cách sử dụng new <classname>().

Nếu chúng ta khởi tạo thể hiện theo cách Java thông thường ở bất kỳ đâu trong mã, thì mùa xuân sẽ không thêm thành phần đó vào vùng chứa IOC.

Các vấn đề liên quan