为什么SpringBeanFacesELResolver会取消UIComponent的绑定?
Why does SpringBeanFacesELResolver cancel UIComponent binding?
我有一个使用 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 安全性 进行身份验证管理。所以我实现了
UserDetailsService
接口,在 spring 安全配置中指定的实现被注入到我的托管 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 字段在运行时为空。具有绑定但未注入托管属性的 Bean 不存在该问题。
到底是怎么回事?我不太明白其中的联系...
谢谢。
正如解释的那样in this answer。
我的登录页面支持 bean 最初是由 JSF 管理的。 JSF 一直在初始化 UIcomponent 属性。当我添加一个新的托管 属性 并在 spring 安全配置中配置它的注入时,我实际上让我的 bean 由 Spring 管理。因此,先前由 JSF 初始化的属性变为空。
作为 w\a 我决定将 bean 中的功能拆分为两个单独的 bean。其中一个将由 Spring 管理,另一个由 JSF 管理。
我有一个使用 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 安全性 进行身份验证管理。所以我实现了
UserDetailsService
接口,在 spring 安全配置中指定的实现被注入到我的托管 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 字段在运行时为空。具有绑定但未注入托管属性的 Bean 不存在该问题。 到底是怎么回事?我不太明白其中的联系...
谢谢。
正如解释的那样in this answer。
我的登录页面支持 bean 最初是由 JSF 管理的。 JSF 一直在初始化 UIcomponent 属性。当我添加一个新的托管 属性 并在 spring 安全配置中配置它的注入时,我实际上让我的 bean 由 Spring 管理。因此,先前由 JSF 初始化的属性变为空。
作为 w\a 我决定将 bean 中的功能拆分为两个单独的 bean。其中一个将由 Spring 管理,另一个由 JSF 管理。