1

Spring 3.1.0.RELEASE、JSF 2.x、JPA 2 と Hibernate Provider を使用して Web アプリケーションを実行しています。わかりやすい URL には PrettyFaces 3.3.2 を使用します。アプリケーションは Tomcat 6.35 で実行されます。

Jsf ViewScope を使用したかったので、Web で見つかった実装に従うことにしました: http://comdynamics.net/blog/109/spring3-jsf2-view-scope/

public class ViewScope implements Scope {

    private static final Logger logger = LoggerFactory.getLogger(ViewScope.class);

    @Override
    public Object get(String name, ObjectFactory objectFactory) {
        final Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();

        Object instance = viewMap.get(name);
        if (instance == null) {
            instance = objectFactory.getObject();
            viewMap.put(name, instance);
        }
        return instance;
    }

    @Override
    public Object remove(String name) {
        logger.debug("ViewScope::remove {}", name);
        return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name);
    }

    @Override
    public String getConversationId() {
        return null;
    }

    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
        //Not supported
    }

    @Override
    public Object resolveContextualObject(String key) {
        return null;
    }
}

@PreDestroyshow this question @PreDestroy never called on @ViewScopedのように、それらが呼び出されていないことに気付きました。

ViewScope を持つ Managed Bean は destruct されないということですか? メモリリークを行う行為。このスコープを使用する必要がありますか?

Spring または Mojarra のカスタム Viewscope でのみ発生しますか?

ありがとう。

4

2 に答える 2

1

問題は、ビュー スコープの実装が正しくないことです。Spring Bean を作成しますobjectFactory.getObject();が、破棄することはありません。

それを解決するには、 をサポートする正しい実装registerDestructionCallbackを確認してください。

BWT、現在の Mojjara 実装では@PreDestory、Bean呼び出されません。ただし、少なくとも Bean インスタンスは解放されます。

于 2013-03-14T13:28:42.090 に答える
0

spring カスタム ビュー スコープを使用して、Jsf ビュー スコープ Bean のメモリ リークの回避策を試しました。Jsf 2.1 と 2.2 の両方で機能します。以下のリンクのコードを試してください。 ViewScoped Bean でのメモリ リーク?

于 2014-02-05T17:13:00.400 に答える