2017-05-31 14 views
5

私は春の完全な初心者です。NoSuchBeanDefinitionException: 'int型の修飾Beanがありません。

私は現在、RequestMapping、RequestBody、RequestResponseおよびRestTemplateをテストできるかどうかを確認しようとしています。

私は応答としてこのオブジェクトを受け取りたいと思った:

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; 
    } 
} 

しかし、私が手:だから

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] 

、それが言う、

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. 

しかし、どのように、私は本当に作成できますか'int'のBean定義ですか?

私は何をしましたか? KrishnaKuntalaへ

// EDIT

おかげで、それは私がデフォルトコンストラクタを持っていなかったという理由だけでした。

すぐに問題を解決しました。

+0

Springが 'TestObjectImpl'をどのようにインスタンス化すると思いますか? –

+0

'TestObjecImpl'クラスにデフォルト(パラメータコンストラクタなし)を追加してみてください。 –

+0

@SotiriosDelimanolis私は別のメインクラスに@SpringBootApplicationを持っています。もし私が 'TestObjectImpl'に@Componentを持っていれば、Springはそれを自動的にスキャンします。 –

答えて

3

@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; 
    } 
} 

は、その後、あなたはのApplicationContextにそれらを追加する必要があります。

<context:property-placeholder .../> 

これをデフォルトのコンストラクタで修正する場合は、Beanを初期化するための別のメカニズムが必要です。前の手順ではなく、非argコンストラクタを追加する場合は、何をしているのかを知る必要があります。

+0

@SotiriosDelimanolis、そうですね。あなたが気にしないなら、私の更新された答えを確認できますか?私が何か間違ったことを言ったら教えてください。 (そして、何が起こったのか申し訳ありません、私の悪い) –

0

TestObjecImplクラスにデフォルト(パラメーターコンストラクターなし)を追加してみてください。

あなたは、単純なプロパティを注入することができ、容易に@value注釈とプレースホルダとのプロパティにアクセスすることができます
@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

どうしたらいいのですか?なぜそれは現在失敗していますか、そしてあなたの提案は何を変えますか? –

2

デフォルトの引数なしコンストラクタを使用してBeanを作成する必要はありません。あなたのケースでは:

1)あなたはXML構成を使用し、引数に取るコンストラクタを使用したい場合は、あなたはそうのようなコンストラクタ、引数の要素とそれらを指定する必要があります。

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

2 )あなたは、Javaの設定クラスを使用している場合、あなたはこのようなものが必要になります。

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

constructor injection in springについてこの便利な記事を見てください。

関連する問題