Spring:不能将String作为构造函数arg注入到xml定义的bean中

时间:2016-08-15 11:44:37

标签: java spring spring-security

我试图将一个简单的String作为构造函数arg注入到扩展org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint的bean中。这是班级:

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

在我的security-context.xml中,我已经将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: {}

奇怪的是它适用于以下配置:

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

因此,仅声明一个String bean而不使用它会使应用程序运行。有人可以向我解释为什么会发生这种情况吗?

L.E:我使用的是Spring上下文4.3.0和Spring security 4.1.0

修正: 因为它是在xml中定义的,并且还使用@Component进行了注释,所以Spring会生成2个相同类型的实例,所以当Spring尝试在扫描包时调用构造函数并且它没有自动装配的String作为构造函数arg传递时出现错误。我通过简单地从AuthenticationEntry Point类中删除@Component来解决它。

我们现在可以删除这篇文章

2 个答案:

答案 0 :(得分:2)

问题是由@Component注释引起的 - 它在组件扫描期间被拾取,并且您没有为该bean定义提供字符串,导致容器配置失败。

要修复您必须删除其中一个配置,并且您决定保留基于注释的配置,还要使用@Value注释注入字符串。

答案 1 :(得分:0)

它发现了一个错误。如果你有2个相同bean的实例,如果标签id在bean内部,如何为每个实例注入不同的字符串。