【问题标题】:Inject producer method that returns String CDI注入返回字符串 CDI 的生产者方法
【发布时间】:2014-03-04 04:30:56
【问题描述】:

我想使用 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

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

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

但没有任何改变。

【问题讨论】:

  • 16 小时过去了,没有任何回应....
  • 不要咄咄逼人。这里没有人有权获得闪电般的答案。此外,您的问题的解决方案在该死的手册中。

标签: jakarta-ee cdi weld


【解决方案1】:

为未来的读者提供简短信息:

除了四个内置作用域外,CDI 还支持两个伪作用域:

  1. @Singleton
  2. @Dependent

以上两个伪作用域都有一个有趣的特性:CDI 不会为它们创建代理对象。

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

【讨论】:

    【解决方案2】:

    问题是您在生产者方法上使用了@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.)
    

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 1970-01-01
      • 2013-01-07
      • 2017-02-09
      • 2015-10-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2011-11-20
      相关资源
      最近更新 更多