2015-08-31 5 views
2

Как видно из заголовка, я получаю исключение класса при попытке заменить log4j/slf4j протоколирование протоколом ESAPI в моем коде , В частности, это происходит следующим способом:ClassCastException: org.apache.log4j.Logger не может быть передан в org.owasp.esapi.Logger

private Logger log() 
    { 
     return ESAPI.getLogger(getClass()); 
    } 

Ниже приведены импорт специфических к регистратору:

import org.owasp.esapi.ESAPI; 
    import org.owasp.esapi.Logger; 

Что делает этот невероятна для меня является то, что есть ESAPI регистрация на месте и в других классы, которые работают отлично. По моему мнению, я думал, что если log4j loggers были на месте и работали тогда, было бы простым делом заменить ESAPI, поскольку это расширение. Мои log4j файл свойств также имеет loggerFactory определен -

log4j.loggerFactory=org.owasp.esapi.reference.Log4JLoggerFactory 

Любые идеи относительно того, что может быть происходит? Это просто приложение java/struts/spring.

+0

Если вы не хотите использовать log4j, почему это в вашем проекте? Просто удалите все импорт и все, и вместо этого используйте esapi. – Zarwan

+0

Каков полный тип (включая пространство имен) «Logger» в вашем первом методе? Это должно быть 'org.owasp.esapi.Logger'. – Nitram

+0

Даже с использованием org.owasp.esapi.Logger как возвращаемого типа метода я получаю то же исключение. Что касается возможности просто не использовать log4j, я, к сожалению, не могу сделать этот звонок. Увидев, как ESAPI работает в других разделах проекта, я не понимаю, почему я не могу поменять его здесь. – SchwarzePete

ответ

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