【问题标题】:WELD-001413: The bean... has a non-passivation-capable dependency Producer Method (CDI 1.2)WELD-001413:bean... 具有非钝化能力的依赖生产者方法 (CDI 1.2)
【发布时间】:2017-03-09 14:26:41
【问题描述】:

我正在尝试从 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;
//...
}

注入的依赖

public interface ConfigurationReader extends Serializable {
}

制片人:

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

根据CDI spec

生产者方法具有钝化能力当且仅当它永远不会 返回一个在运行时不支持钝化的值。

所以我的生产者总是返回一个能够钝化的实例。
我不明白为什么 Weld 抱怨它。

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

【问题讨论】:

  • 您是否检查过您是否使用了正确的 Singleton-Annotation?
  • 我刚刚检查了@markus_,它是正确的(javax.inject.Singleton
  • 奇怪的是它曾经在 CDI 1.0 上工作。在我更新到 CDI 1.2 和 Weld 2.3.0 后,问题出现了。可能是错误?

标签: java serialization cdi java-ee-7 weld


【解决方案1】:

嗯,我可以重现你的问题。我重新阅读了 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和依赖项的验证

如果生产者方法声明了一个钝化范围并且:

  • 具有声明为 final 且未实现或扩展 Serializable 的返回类型,或者,
  • 有一个不能钝化的注入点。

6.6.1.能钝化的bean

生产者方法具有钝化能力当且仅当它从不返回在运行时不具有钝化能力的值。

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

那么,哪些示波器可以钝化?答案:只有会话和对话范围以及您自己的声明 @NormalScope(passivating=true) 的范围。意味着,@Singleton 不是(参见 6.6.4.Passivation 范围)。

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

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

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

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

最后:你可以直接注入单例但不能通过生产者方法,这有意义吗?我会说:不。但是规范中是这样写的,对不起。

祝你好运。

【讨论】:

  • 很好的解释@markus_!关键在于 Producer 的范围。我已更改为 ApplicationScoped。虽然我不明白为什么 Singleton 和 AplicationScoped 以不同的方式工作......
  • 我仍然怀疑 Weld 是否应该在这种情况下验证我的字段,因为我使用 Externalizable 接口进行精细/手动序列化,而不是反射接口 (Serializable)。所以,对我来说,它不应该在使用 Externalizable 时检查我的字段
【解决方案2】:

在类 ConfigurationReaderFacde 的外观中添加 @Stateless

@Stateless public class ConfigurationReaderFacde extends AbstractFacade<ConfigurationReaderFacde> { }

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
相关资源
最近更新 更多