JSF ManagedBean - внедренные свойства не работают правильно на STATE_SAVING_METHOD = клиент - PullRequest
0 голосов
/ 03 апреля 2012

У меня проблема с двух дней, и я не могу выбраться из этого.

Проблема, с которой я сталкиваюсь - это использование свойства MangedBean после десериализации (я полагаю).
Свойство (purchaseManager) устанавливается с помощью Spring и использует DAO, который расширяет MyBatis в качестве средства отображения данных для взаимодействия с БД.
Фактически при первом доступе к странице purchaseManager.getAll () внутри метода init () работает нормально..
Когда я пытаюсь вызвать refreshList () как действие от кнопки, у меня возникает исключение NullPointerException для getSqlSession () внутри DAO.

При разрешении только соответствующего кода ситуация выглядит следующим образом:

@ManagedBean(name = "purchaseController")
@ViewScoped
public class PurchaseController implements Serializable{

    @ManagedProperty(value = "#{purchaseManager}")
    private PurchaseManager purchaseManager;

    @PostConstruct
    public void init(){
        purchaseManager.getAll();
    }

    public void refreshList(){
        purchaseManager.getAll();
    }
}

public class PurchaseManagerImpl implements PurchaseManager, Serializable {
    PurchaseDAO purchaseDAO;

    public void getAll() {
        purchaseDAO.getAll()
    }
}

public class PurchaseDAOImpl extends SqlSessionDaoSupport implements PurchaseDAO, Serializable {

    public void getAll() {
        SqlSession session = getSqlSession();  // when the call comes from refreshList(), session is null
        session.selectList("PAYMENT.getAll", null);
    }
}

in web.xml
<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>

Если я изменил STATE_SAVING_METHOD на сервер, приложение работает нормально, но это не то, что я хочу.То же самое, если я сделаю ManageBean как RequestScope, но это также накажет мои требования.

Заранее благодарю всех за любую помощь!Ermal

1 Ответ

0 голосов
/ 04 апреля 2012

Устранена ошибка добавления <aop:scoped-proxy proxy-target-class="false" /> в определение службы / менеджера, объявленного через Spring. Это делает возможным внедрение полностью сериализуемого экземпляра прокси.

<bean id="purchaseManager" class="al.ozone.bl.manager.impl.PurchaseManagerImpl">    
    <property name="purchaseDAO" ref="purchaseDAO" />   
    <aop:scoped-proxy proxy-target-class="false" />
</bean> 

proxy-target-class="false" означает, что PurchaseManagerImpl уже реализует интерфейс. Если установлено значение true или опущено, должна использоваться библиотека CGLIB2.

Таким образом, JSF правильно берет данные из БД, используя Spring + MyBatis.

Тайна (для меня) в этом вопросе (более теоретическая):

  • Правильно ли обрабатываются объект MyBatis (PurchaseDAOImpl) и dataSource за кадром?
  • Они воссоздаются или восстанавливаются при каждом HTTP-запросе?

Помните, что у меня STATE_SAVING_METHOD=client и BackingBean как ViewScope.
Моя цель - сделать сервер легче, потому что я ожидаю большого количества взаимодействий с пользователем.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="poolPreparedStatements" value="true" />
    <property name="defaultAutoCommit" value="false" />
</bean>

Большое спасибо всем за свет в этом вопросе!

Консультационные ссылки:

Сессионные компоненты Spring (контроллеры) и ссылки на службы в терминах сериализации

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes-other-injection

http://www.infoq.com/presentations/Whats-New-in-Spring-3.0

...