Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ClassCastException:org.apache.log4j.Logger不能强制转换为org.owasp.esapi.Logger_Java_Logging_Log4j_Classcastexception_Esapi - Fatal编程技术网

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

Java ClassCastException:org.apache.log4j.Logger不能强制转换为org.owasp.esapi.Logger,java,logging,log4j,classcastexception,esapi,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/slf4j日志时,出现了一个类强制转换异常。具体而言,它通过以下方法发生:

    private Logger log()
    {
        return ESAPI.getLogger(getClass());
    }
以下是特定于记录器的导入:

    import org.owasp.esapi.ESAPI;
    import org.owasp.esapi.Logger;
让我感到难以置信的是,在其他类中有ESAPI日志记录,它工作得很好。根据我的理解,我认为如果log4j记录器已经就位并开始工作,那么将其替换为ESAPI将是一个简单的问题,因为它是它的一个扩展。我的log4j属性文件还定义了loggerFactory--


关于可能发生的事情有什么想法吗?这只是一个简单的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的logger,并使底层实现类可用,这在某种程度上破坏了信息隐藏的意义

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


-凯文

如果你不想使用log4j,为什么它会出现在你的项目中?只需删除所有导入和所有内容,并改用esapi。在第一个方法中,
记录器的完整类型(包括名称空间)是什么?它必须是org.owasp.esapi.Logger
。即使使用org.owasp.esapi.Logger作为方法的返回类型,我也会得到相同的异常。至于不能直接使用log4j,我很遗憾不能打那个电话。看到ESAPI在项目的其他部分是如何工作的,我不知道为什么我不能在这里交换它。@Zar ESAPI的日志系统对log4j有很强的依赖性。这是不幸的,但却是现实@施瓦泽彼特:在我看来,这就像是一场与esapi记录器的比赛。。。可能是一个
ClassLoader
问题,其中抽象类在
esapi.Logger
之前声明了
log4j.Logger
    log4j.loggerFactory=org.owasp.esapi.reference.Log4JLoggerFactory