WELD-001413:The Bean ..具有不可用的依赖性生产者方法(CDI 1.2)



我正在尝试从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规格:

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

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

在这种情况下,生产者或依赖性无效?

hm,我可以重现您的问题。我重新阅读了CDI 1.0和1.2规格。CDI 1.2实际上比CDI 1.0更清晰,据我所知,焊接中的变化很正确。

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

首先:生产者方法的验证:

6.6.5。

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

  • 具有声明为最终的返回类型,并且不实现或扩展可序列化,或者,
  • 具有不钝化的注射点。

6.6.1。动机豆

生产者方法在且仅当它永远不会返回无法在运行时钝化的值时进行钝化。

结论:如果要在钝化范围中使用结果,则必须用钝化的注释来注释生产者方法。

好吧,哪些范围具有钝化?答案:仅会话和对话范围以及您自己的声明@normalsCope(palivating = true)的会话。意思是,@singleton不是(请参阅6.6.4。

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

您真的希望在对话中使用单身人士吗?当您对话时bean被钝化时,您的单身人士也将是。您需要实现Readresolve和Writereplace(请参阅可序列化的API)才能真正创建单身人士。周围没有代理对象。

重新考虑您的解决方案,在大多数情况下,(代理)应用程序是您想要的。

尽管如此,您实际上可以通过标准@Inject机制将 @singleton-bean注入@conversationsCope(没有生产者,只是纯射击)。请注意, @singleton-bean将不会使用beans.xml和bean-discovery mode ="注释"(您需要读取等级等)自动检测到一个。

最后:您可以简单地注入单身人士,但不能通过生产者方法来注射是有意义的吗?我会说:不。但这就是用规格写的,很抱歉。

祝你好运。

在您的class configurationReaderfacde的外观中添加@stateless

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

相关内容

最新更新