2017-05-31 16 views
5

Tôi là người mới bắt đầu hoàn chỉnh vào mùa xuân.NoSuchBeanDefinitionException: Không có loại đậu đủ tiêu chuẩn loại 'int'

Tôi hiện đang cố gắng xem liệu tôi có thể kiểm tra RequestMapping, RequestBody, RequestResponse và RestTemplate hay không.

Tôi muốn nhận đối tượng này như phản ứng:

public interface TestObject { 
    public int getId(); 
    public String getValue(); 
} 

@Component 
public class TestObjectImpl { 

    private int id; 
    private String value; 

    public TestObjectImpl(int id, String value){ 
     this.id = id; 
     this.value = value; 
    } 

    public int getId(){ 
     return id; 
    } 

    public String getValue(){ 
     return value; 
    } 
} 

Tuy nhiên, tôi nhận được:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'int' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
at io.yclub.castr.ads_java.ApplicationServer.main(ApplicationServer.java:12) [main/:na] 

Vì vậy, nó nói,

Description: 
Parameter 0 of constructor in io.yclub.castr.ads_java.google.adwords.model.TestObjectImpl required a bean of type 'int' that could not be found. 

Action: 
Consider defining a bean of type 'int' in your configuration. 

Nhưng làm thế nào để thực sự tạo một định nghĩa bean cho 'int'?

Tôi đã làm gì?

// EDIT

Nhờ KrishnaKuntala, đó chỉ là vì tôi đã không có một constructor mặc định.

Đưa ngay lập tức giải quyết được vấn đề.

+0

Làm thế nào để bạn mong đợi Spring khởi tạo 'TestObjectImpl'? –

+0

Hãy thử thêm một mặc định (không có hàm tạo tham số) trong lớp 'TestObjecImpl' của bạn. –

+0

@SotiriosDelimanolis Tôi có @SpringBootApplication trên một lớp học chính khác. Tôi tin rằng nếu tôi có @Component trên 'TestObjectImpl' Spring sẽ tự động quét nó. –

Trả lời

3

Bạn có thể chích tính đơn giản và có thể dễ dàng truy cập vào các thuộc tính với @value chú thích và placeholders:

@Component 
public class TestObjectImpl { 
    private int id; 
    private String value; 

    @Autowired 
    public TestObjectImpl(@Value("${prop1}")int id, @Value("${prop2}")String value){ 
     this.id = id; 
     this.value = value; 
    } 

    public int getId(){ 
     return id; 
    } 

    public String getValue(){ 
     return value; 
    } 
} 

Sau đó, bạn cần phải thêm chúng vào applicationContext:

<context:property-placeholder .../> 

Lưu ý

Nếu bạn sửa chữa nó với hàm tạo mặc định, bạn sẽ cần một cơ chế khác để khởi tạo bean của bạn, vì vậy, bạn phải biết bạn đang làm gì nếu bạn muốn thêm hàm tạo non arg thay vì làm trước đó.

+0

@SotiriosDelimanolis, vâng, bạn nói đúng. Nếu bạn không nhớ, bạn có thể kiểm tra câu trả lời cập nhật của tôi không? cho tôi biết nếu tôi nói điều gì sai. (và xin lỗi vì những gì đã xảy ra, tệ hại của tôi) –

0

Hãy thử thêm mặc định (không có hàm tạo tham số) trong lớp TestObjecImpl của bạn.

@Component 
public class TestObjectImpl { 

    private int id; 
    private String value; 

    public TestObjectImpl(){ 
    } 

    public TestObjectImpl(int id, String value){ 
     this.id = id; 
     this.value = value; 
    } 

    public int getId(){ 
     return id; 
    } 

    public String getValue(){ 
     return value; 
    } 
} 
+0

Tại sao họ nên làm điều này? Tại sao nó hiện không thành công và đề xuất của bạn thay đổi? –

2

Bạn không bắt buộc phải chỉ sử dụng hàm tạo mặc định không có đối số để tạo bean. Trong trường hợp của bạn:

1) Nếu bạn đang sử dụng cấu hình XML và muốn sử dụng một constructor mà mất trong lập luận, bạn cần phải xác định chúng với các yếu tố constructor-arg như vậy:

<bean id="SomeObject" class="com.package.SomeObject"> 
    <constructor-arg val="someVal"/> 
    <constructor-arg val="anotherVal"/> 
</bean> 

2) Nếu bạn sử dụng một lớp cấu hình Java, bạn sẽ cần một cái gì đó như thế này:

@Configuration 
public class Config { 
    @Bean 
    public SomeObject someObject() { 
     return new SomeObject(1, "default"); 
    } 
} 

có xem xét bài viết hữu ích này về constructor injection in spring.

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