Невозможно сохранить в обычную конфигурацию в JBoss 5.1

Я пишу веб-приложение, которое использует конфигурацию Apache Commons для чтения / записи файла system.properties. Сам файл помещается в WEB-INF/classes/config. Чтение не проблема, и я могу писать в него при развертывании с помощью Apache Tomcat. Однако, когда я развертываю приложение с помощью JBoss, я не могу писать (используя cofig.setProperty(...). Я получаю следующую ошибку (только JBoss):

2012-01-06 12:53:48,879 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/flint].[flint]] (http-0.0.0.0-8080-1) Servlet.service() for servlet flint threw exception
java.net.UnknownServiceException: protocol doesn't support output
        at java.net.URLConnection.getOutputStream(URLConnection.java:792)
        at org.apache.commons.configuration.AbstractFileConfiguration.save(AbstractFileConfiguration.java:449)
        at org.apache.commons.configuration.AbstractFileConfiguration.save(AbstractFileConfiguration.java:377)
        at org.apache.commons.configuration.AbstractFileConfiguration.possiblySave(AbstractFileConfiguration.java:750)
        at org.apache.commons.configuration.AbstractFileConfiguration.clearProperty(AbstractFileConfiguration.java:789)
        at org.apache.commons.configuration.AbstractConfiguration.setProperty(AbstractConfiguration.java:481)
        at org.apache.commons.configuration.AbstractFileConfiguration.setProperty(AbstractFileConfiguration.java:782)
        at com.talecris.flint.server.config.SystemConfiguration.setResultInvalidColor(SystemConfiguration.java:571)
        at com.talecris.flint.controller.SystemAdminController.setSystemColors(SystemAdminController.java:496)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)

Как я уже сказал, в Tomcat все работает нормально. system.properties разрешения выглядят нормально (owner=Jboss). Я даже открыл разрешения до rw для всех, просто чтобы проверить, но все равно получаю ту же ошибку. Есть ли какой-то параметр JBoss, который мешает моему приложению записывать на путь, по которому оно развернуто?

Я могу записывать файлы и подпапки в каталог развертывания, но не могу записывать изменения в system.properties (через конфигурацию apache commons).


person MTR    schedule 06.01.2012    source источник
comment
Стоит отметить еще одну вещь: я использую CombinedConfiguration: CombinedConfiguration в сочетании;   -  person MTR    schedule 09.01.2012


Ответы (1)


Проблема была связана с использованием VFSFileChangedReloadingStrategy при использовании JBoss.

Вот проблема, которая меня немного расстроила: при использовании конфигурации Apache Commons под JBoss 5 я продолжал сталкиваться со следующей ошибкой при попытке сохранить в моем файле конфигурации (который был ресурсом по пути deployed / classes):

ОШИБКА [org.apache.catalina.core.ContainerBase. [Jboss.web]. [Localhost]. [/ Xxxx]. [Xxxx]] (http-0.0.0.0-8080-1) Servlet.service () для сервлета Flint сгенерировал исключение java.net.UnknownServiceException: протокол не поддерживает вывод в java.net.URLConnection.getOutputStream (URLConnection.java:792) в org.apache.commons.configuration.AbstractFileConfiguration.save (AbstractFileConfiguration.java:449)

Какого черта? Эта ошибка возникала каждый раз, когда я пытался сохранить файл конфигурации. Он отлично работал в Tomcat 6.x, но каждый раз, когда я тестировал JBoss, хотя я мог читать из файла конфигурации, указанная выше ошибка возникала каждый раз, когда я пытался писать в него.

JBoss 5.x VFS (абстракция виртуальных файлов) для файлов, которые он развертывает, и это вызывает проблемы с FileChangedReloadingStrategy Commons Config по умолчанию. Поэтому вместо этого нужно сделать что-то вроде этого:

VFSFileChangedReloadingStrategy f = VFSFileChangedReloadingStrategy (); ((Конфигурация файла)) .setReloadingStrategy (f);

Оказывается, мы действительно хотим использовать VFSFileChangedReloadingStrategy (что означает использование Apache Commons Config 1.7). Это также требует, чтобы API VFS Apache Commons находился в вашем пути к классам. Хорошая новость заключается в том, что VFSFileChangedReloadingStrategy хорошо работает даже с развертываниями без VFS (то есть с обычным старым Tomcat и Jetty). Задача решена!

person MTR    schedule 09.01.2012