2

我正在编写一个使用 Apache Commons 配置来读取/写入 system.properties 文件的 Web 应用程序。文件本身放置在WEB-INF/classes/config. 阅读没有问题,我可以在使用 Apache Tomcat 部署时对其进行写入。但是,当我使用 JBoss 部署应用程序时,我无法编写(使用cofig.setProperty(...). 我收到以下错误(仅限 JBoss):

2012-01-06 12:53:48,879 错误 [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/flint].[flint]] (http-0.0.0.0-8080- 1) servlet flint 的 Servlet.service() 抛出异常
java.net.UnknownServiceException:协议不支持输出
        在 java.net.URLConnection.getOutputStream(URLConnection.java:792)
        在 org.apache.commons.configuration.AbstractFileConfiguration.save(AbstractFileConfiguration.java:449)
        在 org.apache.commons.configuration.AbstractFileConfiguration.save(AbstractFileConfiguration.java:377)
        在 org.apache.commons.configuration.AbstractFileConfiguration.possiblySave(AbstractFileConfiguration.java:750)
        在 org.apache.commons.configuration.AbstractFileConfiguration.clearProperty(AbstractFileConfiguration.java:789)
        在 org.apache.commons.configuration.AbstractConfiguration.setProperty(AbstractConfiguration.java:481)
        在 org.apache.commons.configuration.AbstractFileConfiguration.setProperty(AbstractFileConfiguration.java:782)
        在 com.talecris.flint.server.config.SystemConfiguration.setResultInvalidColor(SystemConfiguration.java:571)
        在 com.talecris.flint.controller.SystemAdminController.setSystemColors(SystemAdminController.java:496)
        在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        在 java.lang.reflect.Method.invoke(Method.java:597)
        在 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
        在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)

正如我所说,它在 Tomcat 中一切正常。system.properties权限看起来不错 ( ) owner=Jboss。我什至为每个人打开了 rw 的权限只是为了测试,但我仍然得到同样的错误。是否有一些 JBoss 设置阻止我的应用程序写入部署它的路径?

我可以将文件和子文件夹写入部署目录,但我无法将更改写入system.properties(通过 apache commons config)。

4

1 回答 1

1

该问题与在 JBoss 上使用 VFSFileChangedReloadingStrategy 有关。

这是一个让我有点沮丧的问题:在 JBoss 5 下使用 Apache Commons Configuration 时,在尝试保存到我的配置文件(这是已部署的 /classes 路径下的资源)时,我一直遇到以下错误:

错误 [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/xxxx].[xxxx]] (http-0.0.0.0-8080-1) Servlet.service() for servlet flint抛出异常 java.net.UnknownServiceException: 协议不支持在 org.apache.commons.configuration.AbstractFileConfiguration.save(AbstractFileConfiguration.java:449) 的 java.net.URLConnection.getOutputStream(URLConnection.java:792) 的输出

有没有搞错?每次我尝试保存到我的配置文件时都会发生此错误。它在 Tomcat 6.x 中运行良好,但任何时候我在 JBoss 上测试时,虽然我可以从配置文件中读取,但每次尝试写入时都会引发上述错误。

JBoss 5.x VFS(虚拟文件抽象)用于它部署的文件,这会导致 Commons Config 的默认 FileChangedReloadingStrategy 出现问题。所以解决方法是做这样的事情:

VFSFileChangedReloadingStrategy f = VFSFileChangedReloadingStrategy(); ((FileConfiguration) 配置).setReloadingStrategy(f);

事实证明,我们真的很想使用 VFSFileChangedReloadingStrategy(这意味着使用 Apache Commons Config 1.7)。这还要求 Apache Commons VFS API 位于您的类路径中。好消息是 VFSFileChangedReloadingStrategy 即使在非 VFS 部署(即普通的旧 Tomcat 和 Jetty)下也能很好地工作。问题解决了!

于 2012-01-09T18:00:36.967 回答