Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 焊接-001413:豆子。。。具有非钝化功能的依赖项生成器方法(CDI 1.2)_Java_Serialization_Cdi_Java Ee 7_Weld - Fatal编程技术网

Java 焊接-001413:豆子。。。具有非钝化功能的依赖项生成器方法(CDI 1.2)

Java 焊接-001413:豆子。。。具有非钝化功能的依赖项生成器方法(CDI 1.2),java,serialization,cdi,java-ee-7,weld,Java,Serialization,Cdi,Java Ee 7,Weld,我正在尝试从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

我正在尝试从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() {
    }
}
根据:

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

因此,我的生产者总是返回一个能够钝化的实例。
我不明白Weld为什么抱怨这件事


在这种情况下,生产者或依赖关系的哪些方面是无效的

嗯,我可以重现你的问题。我重新阅读了CDI 1.0和1.2规范。CDI 1.2实际上比CDI 1.0更清晰,就我所见,焊缝中的变化是非常正确的

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

6.6.5.钝化能力bean和相关性的验证

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

  • 具有声明为final且不实现或扩展Serializable的返回类型,或者
  • 具有无法钝化的注入点
6.6.1.钝化能力

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

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

那么,哪些示波器可以钝化?回答:只有会话和对话范围加上您自己声明@NormalScope(钝化=true)的范围。表示@Singleton不是(参见6.6.4.1钝化作用域)

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

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

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

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

最后:您可以简单地注入一个单例,但不能通过producer方法注入,这有意义吗?我会说:不。但这就是规范中写的,对不起


祝你好运。

你检查过你是否使用了正确的Singleton注释吗?我刚刚检查了@markus,它是正确的(
javax.inject.Singleton
),奇怪的是,它曾经在CDI 1.0上工作过。问题出现在我更新到CDI 1.2和Weld 2.3.0之后。可能是一只虫子?很好的解释@markus_!关键是制作人的范围。我已改为应用程序范围。虽然我不明白为什么Singleton和AplicationScope以不同的方式工作……但我仍然怀疑Weld在这种情况下是否应该验证我的字段,因为我使用Externalizable接口进行精细/手动序列化,而不是反射接口(Serializable)。所以,对我来说,在使用Externalizable时,它不应该检查我的字段