1

コンストラクターベースの依存性注入を使用して、サービスに 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 が必要です。依存関係の注釈: {}

4

1 に答える 1