Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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
Logging CDI注入和序列化_Logging_Cdi_Code Injection - Fatal编程技术网

Logging CDI注入和序列化

Logging CDI注入和序列化,logging,cdi,code-injection,Logging,Cdi,Code Injection,我正在考虑对slf4j记录器使用CDI注入,所以我创建了一个生产者 我将它注入到一个可序列化的应用程序范围内的bean中: @ApplicationScoped public final class CurrentApplicationBean implements Serializable { @Inject private transient Logger logger; } 它必须是暂时的,因为org.slf4j.Logger是一个不扩展Serializ

我正在考虑对slf4j记录器使用CDI注入,所以我创建了一个生产者

我将它注入到一个可序列化的
应用程序范围内的
bean中:

@ApplicationScoped
public final class CurrentApplicationBean implements Serializable {
    @Inject
    private transient Logger          logger;
}
它必须是暂时的,因为
org.slf4j.Logger
是一个不扩展
Serializable
的接口,但这意味着在反序列化之后必须重新注入记录器

我认为CDI不能处理这个问题,你知道什么?

此外,提供程序始终提供一个新的
记录器
实例,因为它必须从
注入点
设置记录器名称,这意味着
请求范围的
bean拥有自己的记录器实例,而不是静态的每类记录器

可能日志记录不是CDI注入的好环境。。。您的考虑事项是什么?

但这意味着在反序列化之后必须重新注入记录器

CDI容器代理是可序列化的。反序列化时,代理将定位/绑定到正确的注入。我不会将注入点标记为瞬态;因为这将防止容器定位/重新绑定注入,并导致NPE

这意味着RequestScope bean有自己的记录器实例,而不是静态的每类记录器

如果您的生产者方法如下所示

@RequestScoped
@Produces   
public Logger produceLog(InjectionPoint injectionPoint) {   
    return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getName());   
}
getLogger()正在为每个类创建一个记录器

也许日志不是CDI注入的好环境。。。你的考虑是什么


这是您的选择。

尽管出于向后兼容性原因org.slf4j.Logger未标记为可序列化,但org.slf4j.Logger的大多数(如果不是所有)实际实现都是可序列化的。另请参见>>我认为CDI不能处理这个问题,你知道什么?不,它不能。>>也许日志不是CDI注入的好环境,它是一个很好的环境:)您的原始代码应该在编译时带有警告,您应该注意CDI代理是可序列化的。但是,当尝试将不可序列化的类注入到可能被钝化的CDI bean中时,在启动时会出现异常:“”无法生成不可序列化的实例以注入钝化bean“”的非瞬态字段中。因此,这里的建议是将磁场标记为瞬态,这实际上会导致钝化/激活后的问题。