2017-09-12 16 views
-3

Spring Beanの自動配線で簡単なテストを行っていますが、インターフェイスがコンストラクタ引数として渡された場合、自動配線は実行されません。ここで豆autowiring中にBeanの作成に失敗しました

package profile; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
@Component 
public class User 
{ 
    private CreateUser user; 

    @Autowired 
    public User(CreateUser user) 
    { 
     this.user = user; 
    } 

    public void addUser(String name, String contact) 
    { 
     System.out.println("Adding "+name+" and "+contact+"....."); 
    } 

    public void showUser() 
    { 
     System.out.println("Added Successfully"); 
    } 
} 

マイ自動設定クラス

package profile; 


import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@ComponentScan 
public class UserConfig { 


} 

ためのコードと私のメインクラスがある

package profile; 

import org.springframework.context.annotation.AnnotationConfigApplicationContext; 

public class UserMain { 

    public static void main(String ar[]) 
    { 
     AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(UserConfig.class); 
     User users = context.getBean(User.class); 
     users.addUser("test", "122466"); 
     users.showUser(); 
     context.close(); 
    } 
} 

私は、次のエラーを取得しています:

run: 
Sep 12, 2017 12:20:28 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh 
INFO: Refreshing org.spring[email protected]1ed6993a: startup date [Tue Sep 12 12:20:28 IST 2017]; root of context hierarchy 
Sep 12, 2017 12:20:28 PM org.springframework.context.annotation.AnnotationConfigApplicationContext refresh 
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'user' defined in file [D:\JsonWithJava\build\classes\profile\User.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'profile.CreateUser' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'user' defined in file [D:\JsonWithJava\build\classes\profile\User.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'profile.CreateUser' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) 
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84) 
    at profile.UserMain.main(UserMain.java:9) 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'profile.CreateUser' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) 
    ... 14 more 
C:\Users\Admin\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1 
BUILD FAILED (total time: 1 second) 

しかし、私がデフォルト共同を使用する場合nstructorプログラムは次のようにうまく動作します。

package profile; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

@Component 
public class User 
{ 
    private CreateUser user; 

    @Autowired 
    public User() 
    { 

    } 

    public void addUser(String name, String contact) 
    { 
     System.out.println("Adding "+name+" and "+contact+"....."); 
    } 

    public void showUser() 
    { 
     System.out.println("Added Successfully"); 
    } 
} 

コードは完全に実行されます。ここでは、出力は次のようになります。

run: 
Sep 12, 2017 12:21:49 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh 
INFO: Refreshing org.spring[email protected]1ed6993a: startup date [Tue Sep 12 12:21:49 IST 2017]; root of context hierarchy 
Adding test and 122466..... 
Added Successfully 
Sep 12, 2017 12:21:49 PM org.springframework.context.annotation.AnnotationConfigApplicationContext doClose 
INFO: Closing org.spring[email protected]1ed6993a: startup date [Tue Sep 12 12:21:49 IST 2017]; root of context hierarchy 
BUILD SUCCESSFUL (total time: 0 seconds) 

コード下記のおConfigurationクラスの書き込みでは....

+4

CreateUser Beanの作成場所はどこですか? Configuartionクラスで作成する必要があります。 Beanがない場合、IOCコントローラはUserクラスのCreateUser BeanをAutowireします。 – SachinSarawgi

+0

これらのコードのどちらも意味をなさない。それは誰かが自分が何をやっているのか分からず、ランダムにコードをコピーしたようなものです。 – Kayaman

+0

Autowireに何もないので、Autowireが動作しているデフォルトのコンストラクタの場合。デフォルトのコンストラクタの場合は、CreateUser属性の上にあるAutowireを使用してください。 – SachinSarawgi

答えて

1

を助けてください:

@Configuration 
@ComponentScan 
public class UserConfig { 

    //If their is default constructor in CreateUser then 
    @Bean 
    public CreateUser createUserBeanCreate(){ 
    return new CreateUser(); 
    } 
} 

別のオプションは、あなたでCreateUserクラス上@Bean使用することです:

@Bean 
public class CreateUser{ 

} 

CreatweUserが(あなたの場合の)インターフェイスである場合、Creaの実装が必要ですそのクラスの上に@Beanアノテーションを使用して、CreateUserの上にautowireを使用するたびに、Spirng IOCコンテナがCreateUser実装をオートワイヤ化できるようにします。 これが役立つことを願っています。

+0

createUserはここではクラスではないインターフェイスです... package profile; パブリックインターフェイスCreateUser { void addUser(String name、String contact); void showUser(); } –

+0

インターフェイスの場合は、そのインターフェイスが実装されている必要があります。あなたはそれの実装がありますか?はいの場合、その実装クラスの上に@Beanアノテーションを使用すればうまくいきます。 – SachinSarawgi

+0

'CreateUser'とは何ですか?なぜ 'User'は' CreateUser'を必要としますか? – Kayaman

関連する問題