Grails - 存储与域相关的属性的位置

时间:2012-04-12 21:53:19

标签: arrays grails

这是我一直在努力的事情。问题是:我有很多(20个左右)静态值数组。我说静态因为这就是我实际存储它们的方式,就像某些域内的静态数组一样。例如,如果我有已知网站的列表,我会这样做:

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

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

毋庸置疑,将它们存储在config.groovy中是不可取的,因为任何更改都需要重新编译。

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

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

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

  1. 使用Enum获取一组固定的属性。如果您依赖代码中的某些地方来处理某些具体的值,请执行此操作。
  2. 如果您不依赖代码中的属性(显然不是这样),请使用String - 类型。在这种情况下,如果您需要提供一个选择框,只需在数据库中对此属性进行distinct - 查询。
  3. 默认值:每个动态属性集使用域类。另一张桌子还可以。