gpt4 book ai didi

java - WELD-001413 : The bean. ..具有不可钝化的依赖生产者方法(CDI 1.2)

转载 作者:行者123 更新时间:2023-12-02 13:41:59 30 4
gpt4 key购买 nike

我正在尝试从 CDI 1.0 升级到 CDI 1.2,但遇到以下问题:

org.jboss.weld.exceptions.UnserializableDependencyException: WELD-001413: The bean Managed Bean [class ViewProcessContext] with qualifiers [@Default @Named @Any] declares a passivating scope but has a non-passivation-capable dependency Producer Method [ConfigurationReader] with qualifiers [@Default @Any] declared as [[BackedAnnotatedMethod] @Produces @Default @Singleton public ConfigurationReaderProducer.process()]
at org.jboss.weld.bootstrap.Validator.validateInjectionPointPassivationCapable(Validator.java:442)
at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:380)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:277)
at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:130)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:151)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:494)
at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:64)
at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:62)
at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:62)
at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:55)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

在 CDI 1.0 上运行良好的代码如下:

错误发生的位置:

@Named
@ConversationScoped
public class ViewProcessContext implements Externalizable {
//...
@Inject
private ConfigurationReader compReader;
//...
}

注入(inject)依赖:

public interface ConfigurationReader extends Serializable {
}

制作人:

@ApplicationScoped
public class ConfigurationReaderProducer implements Externalizable {
//...
@Produces
@Default
@Singleton
public ConfigurationReader process() {
}
}

根据CDI spec :

A producer method is passivation capable if and only if it never returns a value which is not passivation capable at runtime.

所以我的生产者总是返回一个能够钝化的实例。
我不明白为什么韦尔德会提示这一点。

在这种情况下,生产者或依赖项有什么是无效的?

最佳答案

嗯,我可以重现你的问题。我重新阅读了 CDI 1.0 和 1.2 规范。 CDI 1.2 实际上比 CDI 1.0 更清晰一些,而且据我所知,Weld 中的更改非常正确。

参见http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#passivating_scope

第一:生产者方法的验证:

6.6.5.验证具有钝化功能的 Bean 和依赖项

If a producer method declares a passivating scope and:

  • has a return type that is declared final and does not implement or extend Serializable, or,
  • has an injection point that is not passivation capable.

6.6.1.具有钝化功能的 beans

A producer method is passivation capable if and only if it never returns a value which is not passivation capable at runtime.

结论:如果您想在支持钝化的范围内使用结果,则生产者方法必须始终使用支持钝化的注释进行注释。

那么,哪些示波器能够钝化?答案:只有 session 和对话作用域加上您自己的声明 @NormalScope(passivating=true) 的作用域。意味着 @Singleton 不是(参见 6.6.4.钝化范围)。

您也许可以解决这个问题,但是:

你真的希望在你的conversationScope bean 中使用Singleton吗?当你的conversationScoped-Bean被钝化时,你的Singleton也会被钝化。您需要实现 readResolve 和 writeReplace (请参阅 Serializing Api)才能真正创建单例。它周围不会有代理对象。

重新考虑您的解决方案,在大多数情况下,(代理的)applicationScoped-Object 就是您想要的。

尽管如此,您实际上可以通过标准 @Inject 机制将 @Singleton-Bean 注入(inject)到 @ConversationScope 中(没有生产者,只是简单的注入(inject))。请注意,@Singleton-bean 不会被 beans.xml 和 bean-discovery-mode="annotated"自动检测(并且您需要 readResolve 等,如上所述)。

最后:您可以简单地注入(inject)单例,但不能通过生产者方法注入(inject),这是否有意义?我会说:不。但很抱歉,规范中是这样写的。

祝你好运。

关于java - WELD-001413 : The bean. ..具有不可钝化的依赖生产者方法(CDI 1.2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42697857/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com