我试图将一个简单的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来解决它。
我们现在可以删除这篇文章
答案 0 :(得分:2)
问题是由@Component
注释引起的 - 它在组件扫描期间被拾取,并且您没有为该bean定义提供字符串,导致容器配置失败。
要修复您必须删除其中一个配置,并且您决定保留基于注释的配置,还要使用@Value
注释注入字符串。
答案 1 :(得分:0)
它发现了一个错误。如果你有2个相同bean的实例,如果标签id在bean内部,如何为每个实例注入不同的字符串。