JSFアプリケーションでカスタムスコープを構成したいと思います。 Websphere 8.0/8.5では、Primeface 5.3.17でJSF 2.0を使用しています。今のところ、名前付きアノテーションを持つRequestScopedコアおよびSessionScopedモデルBeanがあります。モデルはインジェクションを介してコアに渡されます。これで、多くのブラウザのタブでモデルとの並列処理を行う方法を提供する必要があります。私たちのアイデアは、生成されたタブIDを応答に注入し、後でそれをポストリクエストから抽出し、Extensionに渡して、ビューからBeanを含むマップから必要なBeanをロード/作成し、セッションに格納します。私はフィルタがうまく動作すると思います - 範囲の変更なしで、生成されたタブIDはフォームなどのアクション属性に注入されます。エラーはありません。JSFカスタムスコープ - JavaScriptがありません
しかし、問題は、いくつかのモデルBeanが新しいカスタムスコープを設定して動作することを証明するときです。 「jqueryが定義されていない」という例外があります。私にとってJavaの部分はうまく見えます - 必要なBeanはコンテキストで作成され、同じBeanがコアで使用されます。しかし、jsのロードを担当するすべてのリクエストは空のレスポンスを取得することが判明しました。私はstacktraceを見ていないし、なぜそれが起こるのか全くわからない、どうやってどこでその行動の原因を見つけることができる。
いくつかのコードサンプル:
コンテキスト:
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";
}
誰もがこの問題を接続することができる方法をいくつかのアイデアを持っていますスコープcハンゲとそれを修正する方法? ご協力いただきありがとうございます。
このコードは、どのような意味でもjqueryとは関係ありません。 [mcve]を作成してください... – Kukeltje
はい私はそれを知っています。私はそれがどのように接続されているか全く分かりませんが、Model Beanの添付スコープが変更された唯一のものです。それは不足しているjavascript(jqueryだけでなく、サイトに含まれるべきすべてのjs(いくつかのprimefacesファイルなど))の奇妙な問題を引き起こします。 – Maciekkk
またCSSも欠落していますか? – Kukeltje