java - ClassCastException: org.apache.log4j.Logger 无法转换为 org.owasp.esapi.Logger

标签 java logging log4j classcastexception esapi

从标题中可以看出,在我的代码中尝试用 ESAPI 日志记录替换我的 log4j/slf4j 日志记录时,我遇到了类转换异常。具体来说,它发生在以下方法中:

    private Logger log()
    {
        return ESAPI.getLogger(getClass());
    }

以下是特定于记录器的导入:

    import org.owasp.esapi.ESAPI;
    import org.owasp.esapi.Logger;

让我感到困惑的是,其他类中的 ESAPI 日志记录工作得很好。根据我的理解,我认为如果 log4j 记录器到位并且可以工作,那么将它换成 ESAPI 将是一件简单的事情,因为它是它的扩展。我的 log4j 属性文件还定义了 loggerFactory --

    log4j.loggerFactory=org.owasp.esapi.reference.Log4JLoggerFactory

关于可能发生的事情有什么想法吗?这只是一个简单的 java/struts/spring 应用程序。

最佳答案

即使您正在使用 ESAPI Log4jLoggerFactory 并且在后台使用 log4j Logger,但这并不意味着 org.owasp.esapi.Logger ISA org.apache.log4j.Logger。甚至与那件事无关。 ESAPI 的记录器不是那样做的,因为它也被设计为支持 java.util.logging.Logger。作为该设计决策的结果,org.owasp.esapi.Logger 是一个接口(interface),因此您不能将它转换为任何东西。 (也就是说,它既不扩展 org.apache.log4j.Logger 也不扩展 java.util.logging.Logger。相反,实现更多地作为包装器完成。)

当然,这并不能解决您的问题。如果你真的想使用它,你必须编写相当一部分代码来扩展 ESAPI 的记录器并使底层实现类可用,这在某种程度上破坏了信息隐藏的意义。

也就是说,我并不是在为设计决定辩护。事情就是这样,那些关键的设计决策是在我参与该项目之前就做出的。

-凯文

关于java - ClassCastException: org.apache.log4j.Logger 无法转换为 org.owasp.esapi.Logger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32313994/

相关文章:

java - JProgressBar是在最后更新而不是动态更新

java - NAME ("name",true),true在这里做什么?

logging - ELK堆栈-如何将所有旧日志回填到elasticsearch中?

java - 如何将 log4j 日志记录从 catalina.out 重定向到单独的文件?

java - 从静态初始值设定项访问主要参数

java - 无法将自定义转换器添加到 log4j

java - 如何使用 jax-rs 将 bean 结构映射到不同的模式

java - 如何在JAVA中找不到东西?

MySQL集群: How to decode/interpret binary logs?

java - 带有 log4j 的 Jersey LoggingFilter