为什么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 管理。