Подтвердить что ты не робот

WebApproot в Spring

Получаю это сообщение об ошибке

[SEVERE: Событие инициализации отправки исключений для экземпляра слушателя класса org.springframework.web.util.Log4jConfigListener java.lang.IllegalStateException: системное свойство корневого веб-приложения уже установлено в другое значение: 'webapp.root' = [C:\Users\jaanlai\Documents\NetBeansProjects\absSovellus\build\web] вместо [C:\Users\Administrator\Documents\NetBeansProjects\keycard2\build\web] - выберите уникальные значения для контекстного параметра 'webAppRootKey' в ваших файлах web.xml!

Это странно, потому что у меня нет каких-либо webAppRootKey, определенных в моих файлах. Что это?

4b9b3361

Ответ 1

webAppRootKey - это параметр контекста, который Spring использует в нескольких местах. В этом случае он используется Log4jWebConfigurer. Он предоставляет root webapp как системное свойство, которое может использоваться в конфигурационных файлах log4j, примерно так:

log4j.appender.testfile.File=${webapp.root}/WEB-INF/testlog.log 

Вы использовали бы это, если бы по какой-то причине захотели найти ваши журналы относительно вашего корня webapp.

Проблема, с которой вы сталкиваетесь, заключается в том, что некоторые контейнеры (в частности, Tomcat) не поддерживают сопоставление свойств системы на основе webapp. Если вы не укажете webAppRootKey, Spring по умолчанию будет webapp.root. Поскольку вы используете два приложения в одном контейнере, второе приложение, которое вы пытаетесь запустить, показывает, что webAppRootKey уже установлен (по умолчанию) и выдает ошибку. В противном случае параметр webAppRootKey будет установлен неверно, и вы можете получить журналы из одного webapp в другом webapp.

Вы можете указать другой webAppRootKey с использованием параметров контекста в вашем web.xml, например:

<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>webapp.root.one</param-value>
</context-param>

и

log4j.appender.testfile.File=${webapp.root.one}/WEB-INF/testlog.log 

в вашем log4j. Это должно позаботиться о конфликте.

Ответ 3

Похоже, что у вас есть несколько webapps с настройкой по умолчанию Log4jConfigListener на вашем сервере приложений.

Поведение по умолчанию для Log4jConfigurationListener заключается в том, чтобы открыть webapp root как системное свойство с именем webapp.root, чтобы вы могли использовать его при указании мест в файлах журнала. Однако, если системное свойство с тем же именем уже существует, оно генерирует исключение.

Вы можете настроить имена приложений для этого системного свойства с помощью <context-param> с именем webAppRootKey или отключить отображение свойства системы, установив Log4jConfigListener <init-param> с именем log4jExposeWebAppRoot на false.

См. также:

Ответ 4

На всякий случай кто-то еще сделал это, не избавившись от проблемы:

У нашего webapp был установлен webAppRootKey правильно, но я все еще получил исключение выше. Перезагрузив Glassfish и переделав один и тот же файл войны, перейдите к рисунку.

Ответ 5

Если вы используете logback вместо log4j и получаете ту же ошибку, это решает:

<context-param>
 <param-name>logbackExposeWebAppRoot</param-name>
 <param-value>false</param-value>
</context-param>