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

时间:2012-04-22 19:02:59

标签: grails groovy gsp

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

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

<g:each in="${myObjects}>
  ${it.x}
</g:each>

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

1 个答案:

答案 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>标记而不是三元运算符:)