Почему SpringBeanFacesELResolver отменяет привязку UIComponent?

У меня есть веб-приложение, в котором используется Primefaces. Я привязываю некоторые компоненты Facelet к полям типа UIComponent в моих резервных управляемых компонентах. Что-то вроде этого:

 <p:panel id="loginPanel"
             rendered="false"
             binding="#{loginBean.loginPanel}"
             style="border: none">

И никаких дополнительных аннотаций в бине вот так:

@ManagedBean
public class LoginBean {

    String name;
    String password;
    UIComponent loginPanel;
//...}

Я решил использовать Spring Security для управления аутентификацией. Итак, я реализовал

UserDetailsService

интерфейс, указанная реализация в конфигурации безопасности spring для внедрения в мой управляемый компонент:

<!-- 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 больше не работает. Поле UIComponent в моем LoginBean имеет значение null во время выполнения. Bean-компоненты, которые имеют привязки, но не вводят управляемые свойства, не имеют этой проблемы. Что здесь происходит? Я не очень понимаю связь...

Спасибо.


person Ivan    schedule 10.05.2015    source источник
comment
Я сомневаюсь, что эта штука когда-либо работала, поскольку вы никогда не инициализировали переменную. В какой момент у вас есть UIComponent loginPanel= new Panel();?   -  person kolossus    schedule 11.05.2015
comment
Ни в коем случае. Просто объявление свойства без инициализации сеттера и геттера и привязки на странице xhtml. И это работало и все еще работает для другой формы на той же странице, но эта форма поддерживается другим управляемым компонентом. UIComponent не инициализируется только в компоненте с AuthenticationManager, внедренным Spring.   -  person Ivan    schedule 11.05.2015
comment
Я не могу объяснить такое поведение; инициализировать панель и посмотреть результат   -  person kolossus    schedule 11.05.2015


Ответы (1)


Как объясняется в этом ответе.

Мой вспомогательный компонент для страницы входа изначально управлялся JSF. JSF инициализировал свойство UIcomponent. Когда я добавил новое управляемое свойство и настроил его внедрение в конфигурацию безопасности Spring, я фактически сделал свой bean-компонент управляемым Spring. Таким образом, свойства, которые ранее были инициализированы JSF, стали нулевыми.

В качестве решения я решил разделить функциональность bean-компонента на два отдельных bean-компонента. Одним из них будет управлять Spring, а другим — JSF.

person Ivan    schedule 18.05.2015