2

这是我一段时间以来一直在努力解决的问题。问题是:我有很多(20 个左右)静态值数组。我说静态是因为这就是我实际存储它们的方式,作为某些域中的静态数组。例如,如果我有一个已知网站列表,我会:

class Website {
   ...
   static websites = ["web1", "web2" ...]
}

但是我只是在开发时这样做,因为如果需要我可以轻松更改数组,但是当应用程序准备好部署时我要做什么?在我的项目中,这些值数组很可能在某些时候发生变化。我一直在研究这件事,可以将应用程序属性存储在外部 .properties 文件中,但是存储数组是不可能的,甚至是徒劳的,因为如果某个数组获得了附加值,应用程序将无法识别它直到在需要的地方添加新属性的名称。
另一种方法是将这些信息存储在数据库中,但由于某种原因,添加 20 个或更多只有两行(一个 id 和一个名称)的表似乎是一种浪费。
据我所知,最后一个选项是 XML,但我对这些不是很有经验。看起来 groovy 有一种相对容易创建和读取 XML 文件的方法,但我不知道修改应用程序中预定义布局的 XML 会有多困难。

不用说,将它们存储在 config.groovy 中不是一种选择,因为任何更改都需要重新编译。

我还没有遇到一些“标准”(也许是最佳实践?)处理这些问题的方法。

所以问题是:在哪里存储这些数组?

4

2 回答 2

1

对于像数组这样简单的东西,您应该使用 groovy 自己类型的属性文件。它们也允许您将属性定义为适当的 groovy 变量(不仅仅是字符串),并且显然可以使用 ConfigSlurper 以简单的方式动态地加载它们。有关如何使用此类文件的示例,您可以查看以下ConfigSlurper

对于定义属性:

 my.property.array=[1,2,3,4]

加载属性文件:

 def config = new ConfigSlurper().parse(new File('myconfig.groovy').toURL())
 assert [1,2,3,4] == config.my.property.array

提示:当您想要访问属性文件时,您希望以适用于任何环境的方式进行。要使路径与环境无关,请使用以下路径作为根路径:

 import org.codehaus.groovy.grails.commons.ApplicationHolder 

 def ctx = ApplicationHolder.application.mainContext.servletContext 
 def rootPath = ctx.contextPath 
于 2012-04-12T22:11:20.530 回答
1
  1. 用于Enum一组固定的属性。如果您在代码中的某些地方依赖某些具体值,请执行此操作。
  2. 如果您不依赖代码中的属性(您显然不依赖),请使用String-type。在这种情况下,如果您需要提供一个选择框,只需distinct在您的数据库中对该属性执行 -query 即可。
  3. 默认值:为每个动态属性集使用一个域类。另一张桌子没问题。
于 2012-04-12T23:25:20.393 回答