Jsf 记录器,从@Inject转换为producer

Jsf 记录器,从@Inject转换为producer,jsf,jakarta-ee,cdi,jaas,apache-tomee,Jsf,Jakarta Ee,Cdi,Jaas,Apache Tomee,我在实现类似示例的登录界面时遇到问题 在TomEE的邮件列表上,我被告知我正在使用的LoginController.java试图注入Logger,但Logger注入不是由CDI管理的。我被告知改用制片人。不知道是什么,我在网上搜索,发现 但我仍然不能适应它,所以请解释我必须修改什么来实现记录器的producer LoginController.java 它们是正确的,没有标准的记录器注入。您可以从Weld了解这个示例,了解如何注入客户记录器。请随意修改它以使用java.util.logging

我在实现类似示例的登录界面时遇到问题 在TomEE的邮件列表上,我被告知我正在使用的LoginController.java试图注入Logger,但Logger注入不是由CDI管理的。我被告知改用制片人。不知道是什么,我在网上搜索,发现 但我仍然不能适应它,所以请解释我必须修改什么来实现记录器的producer

LoginController.java


它们是正确的,没有标准的记录器注入。您可以从Weld了解这个示例,了解如何注入客户记录器。请随意修改它以使用java.util.logging


它们是正确的,没有标准的记录器注入。您可以从Weld了解这个示例,了解如何注入客户记录器。请随意修改它以使用java.util.logging

当您使用@Inject时,CDI会尝试为您创建所请求类型的实例。最简单的解决方案是:调用默认构造函数并返回该实例

java.util.logging.Logger存在问题:它没有可见的默认构造函数。因此,您必须告诉CDI如何通过向类路径添加生产者来满足依赖性。尽管使用@JohnAment建议的焊接记录器也是我首选的解决方案,但鉴于您目前的知识状况,如果您从添加自己的生产商开始,这可能对您最有利

因此,在控制器旁边,创建一个新类add package,import。。。你自己

public class LoggerProducer {
   @Produces
   public Logger getLogger(InjectionPoint p) {
     return Logger.getLogger(p.getClass().getCanonicalName());
   }
}
这告诉CDI容器:每当需要注入java.util.logging.Logger时,使用此方法通过获取需要记录器引用的类的fqn名称来创建一个记录器

这应该能解决你的问题。一旦你有了这个想法,想想你是否真的想/需要使用java.util.logging或者你是否想切换到slf4j。在这种情况下,请修改控制器导入,删除刚才编写的LoggerProducer,并将weld logger jar导入到部署中。

当您使用@Inject时,CDI会尝试为您创建请求类型的实例。最简单的解决方案是:调用默认构造函数并返回该实例

java.util.logging.Logger存在问题:它没有可见的默认构造函数。因此,您必须告诉CDI如何通过向类路径添加生产者来满足依赖性。尽管使用@JohnAment建议的焊接记录器也是我首选的解决方案,但鉴于您目前的知识状况,如果您从添加自己的生产商开始,这可能对您最有利

因此,在控制器旁边,创建一个新类add package,import。。。你自己

public class LoggerProducer {
   @Produces
   public Logger getLogger(InjectionPoint p) {
     return Logger.getLogger(p.getClass().getCanonicalName());
   }
}
这告诉CDI容器:每当需要注入java.util.logging.Logger时,使用此方法通过获取需要记录器引用的类的fqn名称来创建一个记录器


这应该能解决你的问题。一旦你有了这个想法,想想你是否真的想/需要使用java.util.logging或者你是否想切换到slf4j。在这种情况下,请修改控制器导入,删除刚才编写的LoggerProducer,并将weld logger jar导入到部署中。

Thx,但我更喜欢修改现有的LoginController.java bean,因为SimTay网站上的整个示例非常适合我的需要,所以,我担心如果我彻底更改它,它将无法工作。是什么让您认为您需要修改登录控制器?producer是一个单独的类。我完全没有使用producer的经验,这让我觉得我需要修改登录控制器。你知道有什么好的网页解释如何使用它吗?就我个人而言,我在互联网上只发现了一些令人困惑的解释。我发现关于生产商的weld文档非常有用:Thx,但我更喜欢修改现有的LoginController.java bean,因为SimTay网站上的整个示例非常适合我的需要,所以,我担心如果我彻底更改它,它将无法工作。是什么让您认为您需要修改登录控制器?producer是一个单独的类。我完全没有使用producer的经验,这让我觉得我需要修改登录控制器。你知道有什么好的网页解释如何使用它吗?就我个人而言,我在互联网上只发现了一些令人困惑的解释。我发现关于生产商的焊接文档非常有用:那么,如果记录器有一个公共默认构造函数,一切都会工作吗?我可能错了,但这仍然不起作用no beans.xml所以如果记录器有一个公共默认构造函数,一切都会起作用吗?我可能错了,但这仍然不起作用no beans.xml