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

ClassCastException: org.apache.log4j.Logger cannot be cast to org.owasp.esapi.Logger

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

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

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

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

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

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

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

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

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

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

-凯文