在CDI钝化功能的bean中,是否可以重新注入非钝化能力的依赖性而不是钝化?

时间:2015-07-06 16:43:54

标签: java java-ee cdi jboss-weld openwebbeans

在CDI Passivation Capable bean中,是否可以重新注入非钝化能力的依赖性而不是钝化?

考虑以下代码:

@SessionScoped
public class UserData implements Serializable {
  @Inject
  private Logger log;
  private String data;
}


@ApplicationScoped
public class LoggerFactory {
  @Produces
  public Logger getLogger(){
  ...
  }
}

public class Logger {
...
}

所以Logger 不是 Serializable,但我真的不在乎。当UserData被反序列化时,是否有可能以某种方式再次调用Logger的生产者?

修改

最初的讨论从这里开始:

http://www.cdi-spec.org/news/2015/07/03/CDI-2_0-EDR1-released/#comment-2119769909

希望CDI专家组提供比@Instance

更好的方法

1 个答案:

答案 0 :(得分:2)

检查spec,你有答案。 Logger不可序列化,因此Logger类型的bean不具备钝化功能。容器不提供您要求的技巧。

解决方案是编写类似的东西:

@SessionScoped
public class UserData implements Serializable {
  @Inject
  private Instance<Logger> logInstance;
  private String data;

  public Logger getLog() {
   return logInstance.get();
  }
}

Ans在您的代码中使用getLog()代替log