我想使用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;
但没有改变。
答案 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还支持两个伪范围:
@Singleton
@Dependent
以上两个伪范围都有一些有趣的特性:CDI没有为它们创建代理对象。
因此,所有不可代理的类(例如由于是最终的或由于缺少no-arg公共构造函数)都可以标记为@Singleton
或@Dependent
- 当然,如果它是有道理的。