我有一个Grails2.1应用程序正在开发中,我有一个服务调用Thread.currentThread().contextClassLoader.getResource(fileName)在grails-app/conf中加载一个配置文件(不过,我希望位置不重要)。
它工作得很好,,只是我必须重新启动grails应用程序才能将更改加载到配置文件中。我真的很想每次请求资源时都能读取文件内容,至少在开发期间是这样的。
此外,如果我能够避免编写自己的缓存系统,我也想避免它。解决方案越简单越好。
我的问题似乎与这个有速度的相似,但使用getClass().getClassLoader().getResource(path).openStream()似乎不起作用。
编辑:我想我可能遗漏了一个重要的细节。我正在检索的资源是非静态的。我使用grails模板引擎将值注入到资源中,如下所示:
Map bindings = [keys: 'values']
new SimpleTemplateEngine().createTemplate(resource).make(bindings).toString()使用我的调试器,我发现资源文本没有变化,但是了解上面的内容可能会改变潜在的答案。
编辑2:我尝试像这样使用URLConnection.setUseCaches(false),但没有结果:
URLConnection connection = Thread.currentThread().contextClassLoader.getResource(path).openConnection()
connection.setUseCaches(false)
connection.connect()
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))
String content = reader.readLines().join('\n')
reader.close()发布于 2012-08-15 04:43:12
如果您以这种方式使用资源,您可能会考虑将其从grails/conf移到/web-app中。
在运行grails run-app时,爆炸war的缓存版本实际上是在容器中运行,外部神奇地监视各种更改路径,并重新编译和复制更新的文件,类似于手动热交换.class文件和其他资源。
对于/web-app中的所有文件,这种监视都是开箱即用的。一旦文件在那里,您就可以使用ServletContext获取该文件的句柄。例如,您可能会执行如下操作:
def templateFile = new File(ServletContextHolder.servletContext.getRealPath('/templates/fileName.gsp')).text把它传递给你的模板引擎。对于锁定文件系统的环境(例如Heroku),getRealPath方法可能无法工作。或者,您也可以使用如下内容:
import org.apache.commons.io.IOUtils
def template = IOUtils.toString(ServletContextHolder.servletContext.getResourceAsStream('/templates/fileName.gsp'), "UTF-8")这种做法的缺点是:
希望这能有所帮助!
发布于 2012-08-14 23:03:15
你能用Spring的ResourceUtils来做这个吗?http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/util/ResourceUtils.html
它看起来有点像ResourceUtils.getFile("classpath:path/to/file.xyz")
发布于 2012-08-15 00:28:04
getClass().getClassLoader().getResource(path)返回一个URL对象,因此缓存很可能由URL/URLConnection执行。
尝试在应用程序启动时使用URLConnection.setDefaultUseCaches(false) (出于性能原因,可能只在dev环境中使用)。这也可以用setUseCaches()方法在每个URLConnection的基础上设置。
https://stackoverflow.com/questions/11961926
复制相似问题