Solución:
Puede cambiar la fábrica de registradores de la fábrica Log4j1 en el archivo ESAPI.properties a otra cosa para evitar este error. No lo he intentado, pero imagino que podrías crear una fábrica de registros personalizada que use Log4j2.
El siguiente ejemplo configurará ESAPI para usar el registro JUL, lo que evita la ClassCastException:
ESAPI.Logger = org.owasp.esapi.reference.JavaLogFactory
Este problema no tiene solución.
ESAPI tiene una fuerte dependencia de Log4J 1.xy actualmente no es compatible con Log4j2.
Hay una mejora abierta para usar slf4j que podría admitir Log4j2 indirectamente, pero en la actualidad esto no está funcionando.
Este problema tiene solución, pero no es una buena solución y es situacional.
Tuve el mismo problema que ATK. Terminé usando el mismo bridge-api que ATK para los otros paquetes, pero para ESAPI hay una desagradable solución.
Mi situación:
Solo he probado esto en Embarcadero y Gato servidores de aplicaciones. Tengo mi propia biblioteca de registro que envuelve log4j2 y Yo uso Scala, no Java.
En primer lugar, la clase que crea ClassCastException es org.owasp.esapi.reference.Log4JLogFactory.
Terminé creando el paquete org.owasp.esapi.reference y creé mi propio objeto Scala llamado Log4JLogFactory. Este objeto amplía mi propio marco de registro (denominado “Registro” en el próximo ejemplo) e implementa la interfaz org.owasp.esapi.LogFactory. Para implementar estos métodos, simplemente paso el mensaje de registro a mi propio marco de registro. Entonces, las llamadas al método log.error (…) provienen de mi propio registrador, y para implementar esta solución necesitará la suya propia.
object Log4JLogFactory extends Logging with org.owasp.esapi.LogFactory {
private[reference] lazy val factory = new Log4JLoggerFactory
def getInstance = {
this
}
private val logger = new org.owasp.esapi.Logger {
override def error(`type`: Logger.EventType, message: String) = log.error(message)
override def error(`type`: Logger.EventType, message: String, throwable: Throwable) = log.error(message, throwable)
// implement the rest of the methods that is needed...
}
override def getLogger(clazz: Class[_]) = logger
override def getLogger(moduleName: String) = logger
}
¡NÓTESE BIEN! Esta solución funciona en Jetty y Tomcat. Los servidores de aplicaciones que no cargan sus propias clases antes de las clases de biblioteca no funcionarán con esta solución.