Grails:覆盖域类中的getter方法

时间:2013-12-17 11:34:25

标签: grails grails-domain-class

我无法覆盖Grails getter方法并变得疯狂。

我想要的是使用double值和字符串值来获取格式化数据,但是当我在String中键入我的覆盖方法时,double值为null,当变为double时,它显然会给我一个错误,因为返回一个String!

我得到了类似的域类:

class Project {
    ...
    String currency
    Double initialTargetAmount
        ...
}

First Override方法(在这种情况下,initialTargetAmount为null):

//@Override Comment or uncomment it does not make any change to the behaviour
public String getInitialTargetAmount() {
        println "${initialTargetAmount} ${currency}" // display "null EUR"
        "${initialTargetAmount} ${currency}" // initialTargetAmount is null
}

第二种方法:

//@Override Comment or uncomment it does not make any change to the behaviour
public Double getInitialTargetAmount() {
        println "${initialTargetAmount} ${currency}" // display "1000.00 EUR"
        "${initialTargetAmount} ${currency}" // Error : String given, Double expected
}

欢迎任何帮助。

施奈特

2 个答案:

答案 0 :(得分:1)

Groovy拥有动态的getter和setter。

因此,initalTargetAmount字段“自动创建”Double getInitialTargetAmount方法。这就是为什么当你有Double返回类型时它可以工作的原因。但是,当您设置String时,getInitialTargetAmount会自动引用不存在的字段String initalTargetAmount

尝试更改方法的名称,例如getInitialAmountWithCurrency(),它会起作用。也许你最好的选择是覆盖toString()方法^^

答案 1 :(得分:1)

你的getter应该总是与你的字段类型相同,并且这是一个很好的方法来改变这样的getter,因为Grails(Hibernate内部)会理解你的对象实例已经改变并会尝试更新它(它会检查旧值和新值。)

你实际上尝试的是一个字符串表示你的金额,所以你有几个选项:

1 - 一种新方法

创建一个返回String的新方法不会干扰hibernate流程,你可以随意使用它。

class Project {
    ...
    String currency
    Double initialTargetAmount
    ...
    String displayTargetAmount() {
       "${initialTargetAmount} ${currency}"
    }

}

2 - TagLib

根据您的需要,您可以创建TagLib来制作班级的自定义表示形式。这可以包括HTML格式。

class ProjectTagLib {
  static namespace = "proj"

  def displayAmount = { attrs ->
    if(!attrs.project) {
      throwTagErrro("Attribute project must be defined.")
    }

    Project project = attrs.remove('project')
    //just an example of html
    out << "<p>${project.initialTargetAmount} , ${project.currency}</p>" 

  }

}