Java ClassCastException:org.apache.log4j.Logger不能强制转换为org.owasp.esapi.Logger
从标题中可以看出,当我试图在代码中用ESAPI日志替换log4j/slf4j日志时,出现了一个类强制转换异常。具体而言,它通过以下方法发生: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; 让我感到难以置信的是,在其
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