我是Grails开发的新手,我想知道处理这个问题的标准方法是什么:
在GSP中,我正在迭代一个域对象列表,很多但不是所有域对象都有getX()方法。我想要一个看起来像这样的标签:
<g:each in="${myObjects}>
${it.x}
</g:each>
但是,由于我的某些对象没有getX方法,因此我收到了“No such property”异常。如果有某种类似“安全操作员”的操作员阻止NPE,我希望如此。没有做'instanceof',有没有好办法解决这个问题?
答案 0 :(得分:7)
我担心Groovy的经营者不会在这里帮助你。如果您要调用方法的引用可以为null,safe navigation operator (?.
)会对您有所帮助;如果你的x
属性是所有对象的属性,那么Elvis operator (?:
)会对你有所帮助,除了对于其中一些属性它可能是null(类似it.x ?: 'no x here'
)。
在这种情况下 - 我假设您正在使用不同类的对象集合,其中一些没有x
属性 - 您可以询问该对象是否具有属性{{ 1}}(请注意,如果对象实现了一个名为x
的方法,那么getX
将为真):
it.hasProperty('x')
将<g:each in="${myObjects}>
${it.hasProperty('x') ? it.x : 'no x here'}
</g:each>
位替换为您的后备值。此外,如果两个选项的逻辑比简单表达式更复杂,您可以考虑使用<g:if>
/ <g:else>
标记而不是三元运算符:)