07.07.2014

Особенность retainAM при использовании нескольких AM

Простой эксперимент позволит нам увидеть разницу между корневым и некорневыми Application Modules (AM).

Eсть страница PagePG, связанная с RootAM. На странице есть регион RegionRN, связанный с ChildAM. С RegionRN мы переходим на страницу RegPagePG и хотим сохранить состояние ChildAM.

Часть кода контроллера RegionRN. Перед переходом на страницу RegPagePG мы создаем запись в ExampleVO (метод createPersonSingleRecord), чтобы удостовериться, что состояние AM сохраняется.
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
    super.processFormRequest(pageContext, webBean);
    if (pageContext.getParameter("btnAdd") != null){
        OAApplicationModule am = pageContext.getApplicationModule(webBean);
        am.invokeMethod("createPersonSingleRecord");
        pageContext.setForwardURL("OA.jsp?page=/oracle/.../RegPagePG",
                              null,
                              OAWebBeanConstants.KEEP_MENU_CONTEXT,
                              null,
                              null,
                              true, // Retain AM
                              OAWebBeanConstants.ADD_BREAD_CRUMB_YES,
                              OAWebBeanConstants.IGNORE_MESSAGES);     
    }
}
Часть кода контроллера RegPagePG. checkCnt возвращает количество записей в ExampleVO.
public void processRequest(OAPageContext pageContext, OAWebBean webBean)
{
    super.processRequest(pageContext, webBean);
    OAApplicationModule am = pageContext.getApplicationModule(webBean);
    Number c = new Number((Number)am.invokeMethod("checkCnt"));
}
Получим с = 0.
Почему?
Дело в том, что retainAM сохраняет состояние корневого AM. В нашем примере это RootAM. Корневой AM принципиально отличается от некорневых; при его инициализации выполняется масса внутренней работы, как то: инициализация ID транзакции, инициализация контекста страницы, ряд других внутренних переменных. Некорневые модули этого не делают и по сути служат контейнерами для VO и VL.

Выход - использовать параметры.


Комментариев нет :