如何在CDI中使用带有String对象的@Disposes

时间:2016-01-05 10:25:38

标签: java cdi

我为@RequestParameter创建了Producer,如下代码:

@Produces
@RequestParameter
public String getStringParameter(InjectionPoint injectionPoint){
    String name = injectionPoint.getAnnotated().getAnnotation(RequestParameter.class).value();

    if("".equals(name)){
        name = injectionPoint.getMember().getName();
    }

    FacesContext facesContext = FacesContext.getCurrentInstance();
    if(facesContext == null){
        return "";
    }

    return facesContext.getExternalContext().getRequestParameterMap().get(name);
}   

Usage:

@ConversationScope
class bean{
   @Inject
   @RequestParameter("ParamX")
   private String paramX;
}

我希望在处理完请求后,变量paramX将变为null。但我无法使用@Disposes作为以下代码,当我在Glassfish中部署ear文件时会发生异常。

public void close(@Disposes String value) { 
   value=null;
}

我应该如何应对这种情况?感谢您的任何提示。

2 个答案:

答案 0 :(得分:2)

  

disposer方法允许应用程序执行生产者方法返回的对象的自定义清理。

https://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Disposes.html

例如,对于需要正确清理的文件或数据库连接,可能需要这样做。

在您的情况下,您的生产者方法可以在您的bean中使用它自己的范围调用。因此,当bean被销毁时,String将被销毁。您不必自己动手。

请注意,您可以通过定义注释来限制生产者,以防止干扰其他生产者方法。然后只有在注入点和生产者方法中存在限定符注释时才会调用生成器。

https://docs.oracle.com/javaee/6/tutorial/doc/gjbck.html

答案 1 :(得分:0)

我不确定你要做什么。如果将String放在请求范围内,它将在请求结束时自动处理。处理程序可以释放垃圾收集器不会自动释放的资源(就像消息队列中的打开文件或监听器一样。它不是用来销毁实例的钩子:容器会做它。 在这里,你得到一个例外,你试图做容器的工作是正常的。