2012-06-04 20 views
1

我正在做一个Web应用程序使用Spring 3.1.0.RELEASE,JSF 2.x,JPA 2与Hibernate Provider。我将PrettyFaces 3.3.2用于友好的URL。该应用程序在Tomcat 6.35上运行。托管豆与自定义ViewScope

我想使用JSF ViewScope所以我决定追随在网络上找到的实现: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; 
    } 
} 

我注意到@PreDestroy不叫上他们喜欢表演这个问题@PreDestroy never called on @ViewScoped

这是否意味着带有ViewScope的托管bean永远不会被破坏?哪些行为发生内存泄漏。我们是否应该使用这个范围?

它只发生在Spring上的自定义Viewscope或Mojarra上吗?

谢谢。

+0

在mojarra @PreDestroy被调用,至少它在我的方法中。我认为如果你使用纯粹的JSF 2支持bean,你会节省很多麻烦。 – IturPablo

+0

@IturPablo你在项目中使用Spring吗? –

+0

Yess !!!,我可以使用JSF标签并访问使用@ManageProperty(“#{}”)标签提供的服务bean。在我看来,更好地使用纯粹的JSF bean,你可以避免一些麻烦,并且你确信你正在使用的jsf版本。 – IturPablo

回答

1

问题是视图范围的不正确的实现。这是创造春豆objectFactory.getObject();,但从不摧毁它。

解决它 - 检查correct implementation支持registerDestructionCallback

BWT,当前Mojjara的实现不会在您的bean too上调用@PreDestory。 但它至少会释放bean实例。

0

我尝试了使用弹簧自定义视图范围的Jsf视图范围bean内存泄漏的解决方法。它适用于Jsf 2.1 & 2.2.Try代码在下面的链接。 Memory leak with ViewScoped bean?