我有一个使用 Primefaces 的网络应用。 我将一些facelet组件绑定到我的支持托管bean中的UIComponent类型字段。像这样:
<p:panel id="loginPanel"
rendered="false"
binding="#{loginBean.loginPanel}"
style="border: none">
并且bean中没有其他注释:
@ManagedBean
public class LoginBean {
String name;
String password;
UIComponent loginPanel;
//...}
我决定使用 Spring Security 进行身份验证管理。所以我实施了
的UserDetailsService
接口,将spring security config中的指定实现注入到我的托管bean中:
<!-- Set MemberDetailsService class as the authentication Manager -->
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider user-service-ref="memberDetailsService">
<sec:password-encoder hash="plaintext"/>
</sec:authentication-provider>
</sec:authentication-manager>
<!-- Inject authentication Manager to our LoginBean -->
<beans:bean id="loginBean" name="loginBean" class="com.mycompany.managed.LoginBean" scope="prototype">
<beans:property name="authenticationManager" ref="authenticationManager"/>
</beans:bean>
我还将Spring的过滤器和监听器添加到web.xml中 - 没什么特别的。 我期待通过在LoginBean中注释我的新字段,如:
@ManagedProperty("#{authenticationManager}")
AuthenticationManager authenticationManager;
工作将完成。但 AuthenticationManager 未在运行时注入,导致NullPointerException。我使用了solution
并使用
创建 faces-config.xml<!-- Enable Spring -->
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
现在验证工作正常。 问题是UIComponent绑定不再起作用我的LoginBean中的UIComponent字段在运行时期间为null。具有绑定但没有注入托管属性的Bean没有这个问题。 到底是怎么回事?我真的不明白这个联系......
THX。
答案 0 :(得分:0)
正如in this answer所述。
我的登录页面的支持bean最初是由JSF管理的。 JSF一直在初始化UIcomponent属性。当我添加一个新的托管属性并在spring安全配置中配置它的注入时,我实际上使我的bean由Spring管理。因此,以前由JSF初始化的属性变为null。
作为一个w \ a,我决定将bean中的功能分成两个独立的bean。其中一个将由Spring管理,另一个由JSF管理。