非常简单的场景:我正在使用Spring和Spring Security,并且我试图将一个属性注入我的AuthenticationManager使用的AuthenticationProvider中。我只是想到我可以在applicationContext中连接它,但不确定它是否会起作用。
applicationContext.xml:
<http use-expressions="true">
<intercept-url pattern="/" access="permitAll" />
<intercept-url pattern="/**" access="hasRole('USER')"/>
<form-login login-page="/index" />
</http>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="twitterAuthenticationProvider" />
</authentication-manager>
<beans:bean id="twitterAuthenticationProvider" class="com.bottlingday.model.auth.TwitterAuthenticationProvider" />
TwitterAuthenticationProvider:
public class TwitterAuthenticationProvider implements AuthenticationProvider
{
@Autowired
private AppEngineUserStore userStore;
static Log log = LogFactory.getLog(TwitterAuthenticationProvider.class.getName());
public void Test()
{
//userStore is always null here
log.info("test");
}
}
在我的控制器中,这会失败,因为userStore是TwitterAuthenticationProvider中的空引用:
Authentication authentication = this.authenticationManager.authenticate(authToken);
这是确切的错误:
java.lang.NullPointerException
at com.bottlingday.model.auth.TwitterAuthenticationProvider.authenticate(TwitterAuthenticationProvider.java:33)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
at com.bottlingday.auth.TwitterAuthController.OauthCallback(TwitterAuthController.java:129)
编辑:我正在使用自动装配,它适用于其他事情。如果我在MVC控制器中自动装配AppEngineUserStore,它每次都会在那里。
答案 0 :(得分:1)
I just had the thought that I might be able to wire it up in the applicationContext, but not sure if that would work.
这样可行。您可以在应用程序上下文中指定属性的连接。
但是,这与自动装配不同(这是AuthenticationProvider
中的内容。
如果您希望自动装配AppEngineUserStore,则需要在应用程序上下文中注册它并打开自动装配。这可以按如下方式完成:
<context:annotation-config />
如果使用的话,Spring也可以扫描bean以自动装配:
<context:component-scan base-package="com.my.package" />
这将自动开启自动装配
答案 1 :(得分:0)
如果您使用自动装配,则表示您在弹簧环境中使用注释。
<context:annotation-config />
否则你需要做基于xml的DI。