Нулевой указатель при вызове предварительно созданного bean-компонента из Spring Container со свойством JSF @managed

Я пытаюсь использовать bean-компонент, созданный в Spring Container в JSF ManagedBean, используя аннотацию @ManagedProperty. Но при использовании этого bean-компонента я получаю нулевой указатель. Как только я запускаю свой сервер, я вижу, что мои bean-компоненты созданы здесь.

Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@9d532ae: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,userBean,userService];

Домашняя страницаBean.java

package come.test.backingbean

 @ManagedBean
    @sessionScoped

        public Class HomepageBean{

        @ManagedProperty(value="#{userBean}")
        private UserBean userBean;// getters and setters


       public String doLogin() {
            String url = "login.xhtml";
            LoginBean manager = new LoginBean();  // This bean has a condition which check for Username and password entered by user.
            if (manager.auth(username, password)) {
                isLoggedIn = true;
                url = "homepage";
                String username=sample;
                userBean.getUserInfo(username);
            } else {
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(username, new FacesMessage(
                        "Invalid Username and or Password"));
            }
            return url;
        }

UserBean.java

package com.test.mypackage

@Component
Public Class UserBean{

@Autowired
private UserService userServie  // getters and setters.

     public void getUserInfo(String userId){
      userService.findByUserId(userId)
 }
}
}

UserService.java

package com.test.service;

public interface UserService {

    public void save(User User);
    public void update(User user);
    public void delete(User user);
    public User findByUserId(String userId);

}

Я вижу, когда мой сервер запустил bean-компонент, который я пытаюсь использовать, был предварительно создан. Я определяю свой applicationContext.xml в web.xml как Context-param. И я определяю все бобы в моем Spring.xml вот так

весна.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config />

<context:component-scan base-package="com.test" />

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

</beans> 

который находится в моем пути к классу и импортирует его как ресурс в applicationContext.xml.

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:security="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <import resource="classpath:database/DataSource.xml" />

    <import resource="classpath:database/Hibernate.xml" />

   <import resource="classpath:config/Spring.xml" />

</beans>

мои лица-confi.xml

<application>
   <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    <resource-bundle>
        <base-name>com.test.boundles.messages</base-name>
        <var>msg</var>
    </resource-bundle>
    </application>

Любая проблема с моим подходом.


person SRy    schedule 19.10.2012    source источник
comment
Это всего лишь деталь; но ваш код даже не компилируется. Если вы не можете написать компилируемый код с самого начала, рассмотрите возможность копирования. Это предотвращает отвлекающие маневры.   -  person BalusC    schedule 19.10.2012
comment
@BalusC ... Эй, можешь проверить, я обновил свой вопрос?   -  person SRy    schedule 19.10.2012
comment
Нет, весна вне меня.   -  person BalusC    schedule 19.10.2012
comment
Хорошо, спасибо. Но мне интересно, как вы не разбираетесь в Java весной?   -  person SRy    schedule 19.10.2012
comment
Почему вы выбрали Spring, а не EJB3+CDI (предлагаемый стандартным стеком Java EE)? Я думаю, что ответ в основном тот же.   -  person BalusC    schedule 19.10.2012


Ответы (1)


Есть несколько вещей, которые должны были быть обработаны лучше.

1) Вам просто нужно <context:component-scan base-package="com.test" />, удалите annotation-config и AutowiredAnnotationBeanPostProcessor.

См. Причина: Разница между ‹context:annotation-config› и ‹context:component- scan› и Документация

2) У вас нет области для вашего UserBean, если вы не укажете какую-либо область, областью действия по умолчанию будет Singleton, что я не думаю, что желательно в этом контексте.

3) Вы пытаетесь использовать интерфейс вместо инстанцируемого класса, реализующего этот интерфейс.

4) Затем вы должны пометить класс реализации с помощью @Service для автоматического подключения.

5) Надеюсь, у вас есть геттеры и сеттеры, а не только эти комментарии.

Хороший пример можно найти по этой ссылке< /а>

Смотрите также:

person Ravi Kadaboina    schedule 19.10.2012
comment
Я не знаю, в чем именно проблема с моим кодом. Потому что я сделал все, что вы предложили в ответе. Но это не то, как работает с аннотацией ManagedPropety. Но удивительно работает, когда упомянул мою службу как зависимость в Faces-config.xml. Как вы думаете, причина может заключаться в том, что я определяю bean-компонент в Faces-config.xml и аннотирую его с помощью @managedBean, и эта аннотация подавляется определением Faces-config, так что определение manageProperty также не работает? - person SRy; 20.10.2012
comment
Рави ... Именно это и происходит. ManagedBean, созданный в файлеfaces-config.xml, подавляет аннотированный ManagedBean непосредственно в bean-компоненте, поэтому, когда я делаю @ManagedPropety, он не работает. В любом случае спасибо за ценные предложения. - person SRy; 20.10.2012
comment
Да, Faces-config.xml имеет приоритет, и аннотации не работают. См. также jsf-manged-property-for-multivalues - person Ravi Kadaboina; 20.10.2012