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

时间:2015-08-31 14:46:25

标签: 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应用程序。

1 个答案:

答案 0 :(得分:1)

即使您正在使用ESAPI Log4jLoggerFactory并使用log4j Logger,但这并不意味着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的记录器并使底层实现类可用,这在一定程度上打败了信息隐藏点。

那就是说,我不是在捍卫设计决定。它就是这样,在我参与该项目之前,这些关键的设计决策就已经做好了。

-kevin