コンストラクターベースの依存性注入を使用して、サービスに aを注入しjavax.inject.Provider<T>
ています。Spring Framework (4.2.5) では、NoSuchBeanDefinitionException
「依存関係のタイプ [T] の適格な Bean が見つかりません。T
注入中に Spring が期待するのはなぜjavax.inject.Provider<T>
ですか? 」というメッセージがスローされます。
サンプルコードは次のとおりです。
プロバイダー:
import javax.inject.Provider;
public class MessageProvider implements Provider<String> {
@Override
public String get() {
return "Hello!";
}
}
サービス:
import javax.inject.Inject;
import javax.inject.Provider;
public class GreetingService {
private final String message;
@Inject
GreetingService(Provider<String> provider) {
// GreetingService(MessageProvider provider) { // this works!
this.message = provider.get();
}
public String greeting() {
return message;
}
}
テスト:
import org.junit.Test;
import static org.junit.Assert.*;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class GreetingServiceTest {
@Test
public void testSomeMethod() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(MessageProvider.class);
ctx.register(GreetingService.class);
ctx.refresh();
GreetingService bean = ctx.getBean(GreetingService.class);
String message = bean.greeting();
assertNotNull(message);
}
}
エラーメッセージは次のとおりです。
「greetingService」という名前の Bean の作成中にエラーが発生しました: コンストラクターによる Bean のインスタンス化に失敗しました。ネストされた例外は org.springframework.beans.BeanInstantiationException: インスタンス化に失敗しました [GreetingService]: コンストラクターが例外をスローしました。ネストされた例外は org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualing bean of type [java.lang.String] found for dependency: この依存関係の autowire 候補として修飾される少なくとも 1 つの Bean が必要です。依存関係の注釈: {}