我是 Grails 开发的新手,我想知道处理这个问题的标准方法是什么:
在 GSP 中,我正在遍历域对象列表,其中很多,但并非所有对象都具有 getX() 方法。我想要一个看起来像这样的标签:
<g:each in="${myObjects}>
${it.x}
</g:each>
但是,由于我的某些对象没有 getX 方法,因此我收到“无此类属性”异常。如果有某种像“安全运算符(operator)”这样的运算符(operator)来防止 NPE,我会很高兴。有没有不做“instanceof”的好方法来处理这个问题?
最佳答案
恐怕 Groovy 的运算符(operator)不会在这里帮助您。 safe navigation operator ( ?.
)如果您要调用方法的引用可能为空,则会对您有所帮助;和 Elvis operator ( ?:
)如果您的 x
会帮助您property 将是所有对象的属性,除了其中一些可能为 null(类似于 it.x ?: 'no x here'
)。
在这种情况下--我假设您正在处理不同类的对象集合,其中一些没有 x
属性——你可以询问对象是否有属性x
(注意,如果对象实现了一个名为 getX
的方法,那么 it.hasProperty('x')
将为真):
<g:each in="${myObjects}>
${it.hasProperty('x') ? it.x : 'no x here'}
</g:each>
更换
'no x here'
无论您的后备值是什么,都可以使用。此外,您可以考虑使用 <g:if>
/ <g:else>
如果两个选项的逻辑比简单表达式更复杂,则使用标签而不是三元运算符:)
关于grails - Groovy/GSP 中鸭子打字的安全操作符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10271101/