当前位置: 首页 > 面试题库 >

为什么CDI bean不支持最终方法

袁翔
2023-03-14
问题内容

我只是在GlassFish服务器下引发了臭名昭著的JavaEE CDI错误:

org.glassfish.deployment.common.DeploymentException: CDI deployment failure:Exception List with 2 exceptions:
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001437 Normal scoped bean class ASController is not proxyable because the type is final or it contains a final method public final void ASController.selectPath(org.primefaces.event.NodeSelectEvent) - Managed Bean [class ASController] with qualifiers [@Default @Any @Named].

该错误非常明显,因为他不喜欢CDI bean中的最终方法,但是我不明白为什么。

在此链接

http://docs.jboss.org/weld/reference/1.1.0.Final/zh-
CN/html_single/#d0e1429

他们解释说,这与序列化有关,但我看不出为什么用final方法序列化一个类比使用非final方法序列化一个类更难。


问题答案:

好了,有几种方法可以实现代理对象。但是,由于您希望代理与被代理bean具有“相同”类型,因此您必须使用继承(或您随后可以实现的需求接口,但这不是每个POJO都可以是一个bean的方法)
CDI)。

也就是说,它们从您要注入的类内部扩展,围绕该类生成一些代理代码,然后为您提供该子类。

然后,该代理将处理所有魔术,以确保您始终有一个适合您上下文的bean(并且该bean的所有成员变量bean均指向正确的bean)。

因此,您实际上并没有收到要注入的bean的类型,而是该bean的代理子类。这对于最终方法和类以及私有构造函数而言效果不佳。

如果该类不是final,则代理可以扩展该类,但是它不能轻易覆盖您的final方法。但是,这可能是需要的(例如,如果您的bean已序列化,则代理需要对其进行反序列化)。

有更复杂的方法可以解决。可以通过通过代理操作类的字节码来注入此功能(例如,删除最终修饰符,注入默认构造函数等),甚至可以将其与继承混合使用,但这还没有实现(和同样对支持多个JVM实现也很重要)。

在链接的资源中,有一条注释表明已计划在将来的发行版中使用:

注意

未来的Weld版本可能会使用非便携式JVM
API支持针对此限制的非标准解决方法:Sun,IcedTea,Mac:Unsafe.allocateInstance()(最高效)IBM,JRockit:ReflectionFactory.newConstructorForSerialization()

但是我们还没有实现这个目标。



 类似资料:
  • 本文向大家介绍为什么jsonp不支持post的方法?相关面试题,主要包含被问及为什么jsonp不支持post的方法?时的应答技巧和注意事项,需要的朋友参考一下 jsonp是跨域解决方案的其中一种方式,依赖script来突破同源策略的限制,而script是通过get方式拉取资源的。 可参考我的文章中的jsonp的实现

  • 本文向大家介绍为什么Java不支持<<相关面试题,主要包含被问及为什么Java不支持<<时的应答技巧和注意事项,需要的朋友参考一下 Java添加了运算符“ >>>”来执行逻辑右移,但是由于 逻辑和算术左移运算是相同的 ,因此Java中没有“ <<<”运算符。 来自Java的Shifts …

  • 我注意到一件奇怪的事情,显然Firefox说它支持HTTPS上的Brotli,但不支持HTTP?Brotli与gzip类似,但效率更高,为什么它会将其限制为HTTPS?在HTTPS选项卡上,我看到: 他被派去了。但在另一个网站上,我没有看到。为什么它不能做Brotli压缩HTTP?

  • 我有点困惑,我们将CDIBean称为我们使用注释注入它们的bean,还是我们在它们内部使用注入的bean?

  • 问题内容: Java为什么不包括对无符号整数的支持? 在我看来,这是一个奇怪的遗漏,因为它们允许人们编写不太可能在意外大的输入上产生溢出的代码。 此外,使用无符号整数可以是一种自我证明的形式,因为它们指示无符号int打算保留的值永远不会为负。 最后,在某些情况下,无符号整数对于某些操作(例如除法)可能更有效。 包括这些的不利之处是什么? 问题答案: 在两行之间阅读时,我认为逻辑是这样的: 通常,J

  • 问题内容: 我已经多次看到,负填充的前景可能会帮助某些页面元素的CSS开发变得越来越好。但是,W3C CSS中没有负填充的规定。这背后的原因是什么?该属性是否有阻碍其使用的阻碍?感谢您的回答。 更新 例如,我看到的情况是,如果您使用的字体的垂直间距为20px,并且希望在字体底部应用虚线边框,例如出现超链接时。在这种情况下,您会发现样式太简陋,因为虚线边框会出现在指定单词下方20px。如果您使用负边