注入返回String CDI的生产者方法

时间:2014-02-06 23:26:15

标签: java-ee cdi weld

我想使用CDI向JSF Web应用程序中的托管bean注入常量字符串消息,这里是生产者类:

@Named
@RequestScoped
public class StringProducer {

   @Produces
   @Named("message")    
   @RequestScoped
   public String getMessage() {
      return "Hello World";
   }
}

以下是它如何在另一个托管bean中注入:

@Inject Named("message") String message;

但这总是导致异常:

org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001435 Normal scoped bean int is not proxyable

我试图在Instance中包装String类型,如下所示:

@Inject Named("message") Instance<String> message;

但没有改变。

2 个答案:

答案 0 :(得分:7)

问题是您在producer方法上使用@RequestScoped注释。删除它,应用程序将按预期工作。

Request Scoped注释用于注释容器管理的 Beans 。为此,容器代理对象的公共方法。然而,像String这样的最终类是不可代理的,正如在使用Weld 2.0.0 SP1的Glassfish 4.0上运行代码时的异常所指出的那样:

WELD-001437 Normal scoped bean class java.lang.String is not proxyable because the type is final or it contains a final method class java.lang.String - Producer Method [String] (...etc.)

答案 1 :(得分:6)

简短的未来读者信息:

除了四个内置范围外,CDI还支持两个伪范围:

  1. @Singleton
  2. @Dependent
  3. 以上两个伪范围都有一些有趣的特性:CDI没有为它们创建代理对象。

    因此,所有不可代理的类(例如由于是最终的或由于缺少no-arg公共构造函数)都可以标记为@Singleton@Dependent - 当然,如果它是有道理的。