为什么SpringBeanFacesELResolver取消UIComponent绑定?

时间:2015-05-10 19:39:24

标签: jsf primefaces spring-security uicomponents

我有一个使用 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 进行身份验证管理。所以我实施了

  

的UserDetailsS​​ervice

接口,将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。

1 个答案:

答案 0 :(得分:0)

正如in this answer所述。

我的登录页面的支持bean最初是由JSF管理的。 JSF一直在初始化UIcomponent属性。当我添加一个新的托管属性并在spring安全配置中配置它的注入时,我实际上使我的bean由Spring管理。因此,以前由JSF初始化的属性变为null。

作为一个w \ a,我决定将bean中的功能分成两个独立的bean。其中一个将由Spring管理,另一个由JSF管理。