![](/img/trans.png)
[英]Grails domain class behaves unexpectedly when overriding implicit getter
[英]Grails : Overriding getter method in domain class
我无法超越grails getter方法而变得疯狂。
我想要的是使用一个双精度值和一个字符串值来获取格式化的数据,但是当我在String中键入重写方法时,double值为null,而当输入double时,则显然会给我一个错误,因为String是回来 !
我得到这样的域类:
class Project {
...
String currency
Double initialTargetAmount
...
}
第一个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
}
欢迎任何帮助。
施奈特
Groovy具有动态的getter和setter方法。
因此, initalTargetAmount
字段会自动“创建”一个Double getInitialTargetAmount
方法。 这就是为什么当您使用Double
返回类型时它可以工作的原因。 但是,当您设置String
, getInitialTargetAmount
自动引用字段String initalTargetAmount
中不存在的String initalTargetAmount
尝试更改方法的名称,例如getInitialAmountWithCurrency()
,它将起作用。 也许您最好的选择是重写toString()
方法^^
您的吸气剂应始终与您的字段相同,这不是更改这种吸气剂的好方法,因为Grails(内部处于休眠状态)将了解您的对象实例已更改并会尝试对其进行更新(它将检查旧的实例)。和新值)。
实际上,您正在尝试使用金额的String表示形式,因此您可以选择以下两个选项:
创建一个返回String的新方法不会干扰休眠流程,您可以使用它。
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>"
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.