2016-08-15 12 views
0

単純なStringをコンストラクタargとしてorg.springframework.security.web.authentication.LoginUrlAuthenticationEntryPointにあるBeanに挿入しようとしています。このクラスは次のとおりです。Spring:コンストラクタargとしてxml定義BeanにStringを挿入できません

<beans:bean id="authenticationEntryPoint" class="a.b.s.AuthenticationEntryPoint" > 
    <beans:constructor-arg index="0" type="java.lang.String" value="/login"/> 
</beans:bean> 

を私が知っているから、これは動作するはずですが、私は次のエラーを取得する:

私のセキュリティのcontext.xmlで
@Component 
    public class AuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint { 

    public AuthenticationEntryPoint(String url) { 
     super(url); 
    } 

    @Override 
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {   
     response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); 
    } 
} 

、私は次のように私のBeanを定義しています:

<beans:bean id="loginUrl" class="java.lang.String"> 
    <beans:constructor-arg value="/login"/> 
</beans:bean> 
<beans:bean id="authenticationEntryPoint" class="a.b.s.AuthenticationEntryPoint" > 
    <beans:constructor-arg index="0" type="java.lang.String" value="/login"/> 
</beans:bean> 
:奇妙である何

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authenticationEntryPoint' defined in file [/a/b/c/d/target/app/WEB-INF/classes/a/b/s/AuthenticationEntryPoint.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type [java.lang.String] found for dependency [java.lang.String]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency [java.lang.String]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 

は、次のような構成で動作するということです

したがって、String Beanを宣言し、それを使用しないと、アプリケーションが実行されません。誰かが私になぜこれが起こっているか説明することができますか?

LE:私は、Springコンテキスト4.3.0と春のセキュリティを使用しています4.1.0

修正: それは、XMLで定義され、また@Componentで注釈されているために、春には、同じタイプの2つのインスタンスを作りますしたがって、春がパッケージをスキャン中にコンストラクタを呼び出そうとしたときに、コンストラクタargとして渡すためのautowired Stringがないときにエラーが発生しました。 @ComponentをAuthenticationEntry Pointクラスから削除するだけで解決しました。

現在の問題は、あなたの@Component注釈によって引き起こされるこのポスト

+3

コンポーネントスキャンを有効にしているとしますか?この場合、 '@ Component'アノテーション付きBean定義が最初に取り出され、アノテーション設定を使用して文字列に' @ Named'または '@ Value'を挿入しようとします。 – mszymborski

+0

ああ、愚かな私、私はあなたのコメントを読んでいる間にそれを考え出した。 xmlで定義され、 '@ Component'でアノテーションされているので、Springは同じ型の2つのインスタンスを作成するので、Springはパッケージをスキャン中にコンストラクタを呼び出そうとしたときにエラーが発生し、 。私は 'AuthenticationEntryPoint'クラスから' @ Component'を削除するだけで解決しました。ありがとうございます@mszymborski –

+0

私はそれが "未回答"セクションを汚染しないように答えとして投稿する予定です。 – mszymborski

答えて

0

を削除することができます - それは、コンポーネントのスキャン中に拾います、そしてあなたは、コンテナ設定が失敗し、そのBean定義の文字列を提供していません。

設定の1つを削除する必要があることを修正し、注釈ベースの設定を保持することを決定する場合は、@Valueアノテーションを使用して文字列も注入します。

関連する問題