Пользовательская область JSF - отсутствует JavaScript

Я хотел бы настроить пользовательскую область в приложении JSF. Мы используем JSF 2.0 с Primefaces 5.3.17 на Websphere 8.0/8.5. На данный момент у нас есть фасонные компоненты RequestScoped Core и SessionScoped с именованными аннотациями. Модель передается в Core через Inject. Теперь нам нужно предоставить способ параллельной работы с моделями на многих вкладках браузера. Наша идея состоит в том, чтобы использовать фильтры для вставки сгенерированного идентификатора вкладки в ответ, а затем извлечь его из почтовых запросов и передать его в Extension для загрузки / создания требуемого bean-компонента из карты с bean-компонентами для каждого представления, сохраненного в сеансе. Я полагаю, что фильтры работают нормально - без изменения области действия сгенерированный идентификатор вкладки вставляется в атрибут действия в формах и т. Д., И ошибки нет.

Но проблема в том, что, когда я устанавливаю новую настраиваемую область видимости для некоторого модельного компонента, чтобы доказать, работает ли он. Я получил исключение, что "JQuery не определен". Для меня Java часть выглядит хорошо - требуемый компонент создается в контексте, а затем этот же компонент используется в ядре. Но оказалось, что каждый запрос, отвечающий за загрузку js, получает пустой ответ. Я не вижу никакой трассировки стека и совершенно не знаю, почему это происходит, как и где я могу найти причину такого поведения.

Некоторые примеры кода:

Контекст:

public class TabScopeContext implements Context, Serializable {

    /**
     * SerialId.
     */
    private static final long serialVersionUID = -558257182139134232L;

    public TabScopeContext() {}

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    @Override
    public <T> T get(Contextual<T> contextual) {
        final Bean<T> bean = (Bean<T>) contextual;
        Map<String, Object> beans = getBeansForCurrentTab();
        if (beans.containsKey(bean.getName())) {
            return (T) beans.get(bean.getName());
        } else {
            return null;
        }
    }

    private Map<String, Object> getBeansForCurrentTab() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        Map<Integer, Map<String, Object>> tabScope;

        if (isTabScopeAlreadyInSession(session)) {
            tabScope = getTabScope(session);
        } else {
            tabScope = initScopeInSession(session);
        }

        Integer viewId = TabScopeViewIdPersister.getInstance().getViewId();

        if (isViewAlreadyInScope(viewId, tabScope)) {
            return tabScope.get(viewId);
        } else {
            return initBeansForView(tabScope, viewId);
        }

    }

    private Map<String, Object> initBeansForView(Map<Integer, Map<String, Object>> tabScope, Integer viewId) {
        Map<String, Object> beans = new HashMap<String, Object>();
        tabScope.put(viewId, beans);

        return beans;
    }

    private boolean isViewAlreadyInScope(Integer viewId, Map<Integer, Map<String, Object>> tabScope) {
        return tabScope.containsKey(viewId);
    }

    private Map<Integer, Map<String, Object>> initScopeInSession(HttpSession session) {
        Map<Integer, Map<String, Object>> beansPerView = new HashMap<Integer, Map<String, Object>>();
        session.setAttribute(TabScope.NAME, beansPerView);

        return beansPerView;
    }

    private boolean isTabScopeAlreadyInSession(HttpSession session) {
        return getTabScope(session) != null;
    }

    @SuppressWarnings("unchecked")
    private Map<Integer, Map<String, Object>> getTabScope(HttpSession session) {
        return (Map<Integer, Map<String, Object>>) session.getAttribute(TabScope.NAME);
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    @Override
    public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext) {
        final Bean<T> bean = (Bean<T>) contextual;

        Map<String, Object> scopeBeansMap = getBeansForCurrentTab();
        if (scopeBeansMap.containsKey(bean.getName())) {
            return (T) scopeBeansMap.get(bean.getName());
        } else {
            T t = bean.create(creationalContext);
            scopeBeansMap.put(bean.getName(), t);
            return t;
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Class<? extends Annotation> getScope() {
        return TabScope.class;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isActive() {
        return true;
    }

}

Расширение:

public class TabScopeContextExtension implements Extension {

public void registerContext(@Observes AfterBeanDiscovery event) {
    event.addContext(new TabScopeContext());
}

}

Объем:

@NormalScope(passivating=true)
@Target({TYPE, FIELD, METHOD })
@Retention(value = RUNTIME)
@Documented
@Inherited
public @interface TabScope {

    public static final String NAME = "TAB_SCOPE";
}

У кого-нибудь есть идея, как эта проблема может быть связана с изменением объема и как ее исправить? Заранее спасибо за помощь.

1 ответ

Решение

Оказалось, что была проблема с кешем браузера. После очистки кеша вроде бы работает.

Другие вопросы по тегам