当前位置: 首页 > 知识库问答 >
问题:

ClassCastException:org.apache.log4j.logger不能强制转换为org.owasp.esapi.logger

韩鸿波
2023-03-14

从标题中可以看出,当我试图在代码中用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应用程序。

共有1个答案

慕光霁
2023-03-14

即使您使用的是ESAPI Log4jLoggerFactory,也使用了log4j记录器,但这并不意味着org.owasp.ESAPI.Logger就是org.apache.log4j.Logger。在那件事上甚至没有关系。ESAPI的记录器不是这样做的,因为它也被设计成支持java.util.logging.logger。作为设计决策的结果,org.owasp.esapi.logger是一个接口,因此您不能将其强制转换为任何内容。(也就是说,它既不扩展org.apache.log4j.logger也不扩展java.util.logging.logger,而是将实现更多地作为包装器来完成。)

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

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

-凯文

 类似资料: