在Groovy/GSP中打鸭的安全操作员

Kyl*_*yle 4 grails groovy gsp

我是Grails开发的新手,我想知道处理这个问题的标准方法是:

在GSP中,我正在迭代一个域对象列表,很多但不是所有域对象都有getX()方法.我想要一个看起来像这样的标签:

<g:each in="${myObjects}>
  ${it.x}
</g:each>
Run Code Online (Sandbox Code Playgroud)

但是,由于我的某些对象没有getX方法,因此我收到了"No such property"异常.如果有某种类似"安全操作员"的操作员阻止NPE,我希望如此.没有做'instanceof'有没有好办法处理这个问题?

epi*_*ian 7

我担心Groovy的经营者不会在这里帮助你.该安全导航操作符(?.)如果参照你要调用的方法可能是无效的,这将有助于你; 和Elvis操作符(?:)会帮助你,如果你的x财产将所有对象的属性,但对于其中一些可能是空(像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>
Run Code Online (Sandbox Code Playgroud)

'no x here'你的后备值替换该位.此外,如果两个选项的逻辑比简单表达式更复杂,您可以考虑使用<g:if>/ <g:else>tags而不是三元运算符:)