2012-04-22 16 views
4

我是新來的Grails的發展,我想知道什麼處理這個問題的標準方法是:安全操作爲在Groovy/GSP鴨打字

在GSP,我遍歷一個列表許多域對象,但並非全部都有getX()方法。我想一個標記,看起來像這樣:

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

但是,因爲我的一些對象沒有了getX方法,我得到一個「沒有這樣的財產」的異常。如果有某種類似「安全運營商」的運營商阻止NPE,我希望這樣做。沒有做'instanceof'處理這個問題有沒有好的方法?

+0

請注意,如果您的對象具有getX方法,屬性語法應該是'it.x'(注意x上的小寫)。如果這是問題,那麼我的答案下面沒有任何意義= P – epidemian 2012-04-22 19:35:14

+0

謝謝。我在上面的代碼示例中將它從.X更改爲it.x,以免混淆其他讀者。 – Kyle 2012-04-22 20:01:12

回答

7

恐怕Groovy的運營商不會幫你。如果你想調用一個方法的引用可能爲null,那麼safe navigation operator (?.)會幫助你;和Elvis operator (?:)會幫助你,如果你的x屬性將是所有對象的屬性,除了其中的一些可能爲空(類似it.x ?: 'no x here')。

在這種情況下 - 我假設你與不同類的對象的集合工作,他們中的一些不具有x property--你可能會問的對象,如果它具有這樣的特性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>標記代替三元運算符: