我无法覆盖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
}
欢迎任何帮助。
施奈特
答案 0 :(得分:1)
Groovy拥有动态的getter和setter。
因此,initalTargetAmount
字段“自动创建”Double getInitialTargetAmount
方法。这就是为什么当你有Double
返回类型时它可以工作的原因。但是,当您设置String
时,getInitialTargetAmount
会自动引用不存在的字段String initalTargetAmount
尝试更改方法的名称,例如getInitialAmountWithCurrency()
,它会起作用。也许你最好的选择是覆盖toString()
方法^^
答案 1 :(得分:1)
你的getter应该总是与你的字段类型相同,并且这是一个很好的方法来改变这样的getter,因为Grails(Hibernate内部)会理解你的对象实例已经改变并会尝试更新它(它会检查旧值和新值。)
你实际上尝试的是一个字符串表示你的金额,所以你有几个选项:
创建一个返回String的新方法不会干扰hibernate流程,你可以随意使用它。
class Project {
...
String currency
Double initialTargetAmount
...
String displayTargetAmount() {
"${initialTargetAmount} ${currency}"
}
}
根据您的需要,您可以创建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>"
}
}