Не удается сохранить конфигурацию в общем виде в JBoss 5.1 - PullRequest
2 голосов
/ 06 января 2012

Я пишу веб-приложение, которое использует конфигурацию 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).

1 Ответ

1 голос
/ 09 января 2012

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

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

ОШИБКА [org.apache.catalina.core.ContainerBase. [Jboss.web]. [Localhost]. [/ Xxxx]. [Xxxx]] (http-0.0.0.0-8080-1) Servlet.service () для сервлета кремень бросил исключение 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 (); ((FileConfiguration) config) .setReloadingStrategy (f);

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

...