Java 如何在CDI中将@Disposes与字符串对象一起使用

Java 如何在CDI中将@Disposes与字符串对象一起使用,java,cdi,Java,Cdi,我为@RequestParameter创建了Producer,代码如下: @Produces @RequestParameter public String getStringParameter(InjectionPoint injectionPoint){ String name = injectionPoint.getAnnotated().getAnnotation(RequestParameter.class).value(); if("".equals(name)){

我为@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;
}

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

我不知道你想做什么。如果您将字符串放入请求范围,它将在请求结束时自动释放。处置器用于释放垃圾收集器不会自动释放的资源(如消息队列上打开的文件或侦听器)。它不是销毁实例的钩子:容器将完成此操作。 在这里,出现异常是很正常的,您试图完成容器的工作

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

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

在您的情况下,您的producer方法可能会在您的bean中使用它自己的作用域调用。因此,当bean被销毁时,字符串将被销毁。您不必自己做这件事

请记住,您可以通过定义注释来限定生成器,以防止与其他生成器方法的干扰。然后,仅当限定符注释出现在注入点和生成器方法时,才会调用生成器