获取属性,即使它们不存在

时间:2018-10-01 15:19:08

标签: groovy hybris

请不要恨我,是的,我想做一些非常愚蠢的事情。

如果每个属性都不存在,我想获取null。我发现可以创建propertyMissing方法:

class User {
    String name = "A"
}

Object.metaClass.propertyMissing() {
    null
}

u = new User();

println u?.name
println u?.namee

此打印:

A
null

现在,我的背上有了“伟大的” Hybris系统:D

如果我在脚本顶部添加propertyMissing部分并在Hybris groovy控制台中运行它,我仍然会收到MissingPropertyException。

是否有另一种方法可以避免MissingPropertyException异常而无需处理数百个try catch? (或数百个println u?.namee ? u.namee : null 不起作用)

/编辑:1

我有以下用例(对于Hybris系统): 我想从某些页面的动态输出中获取所有必要的信息。为什么动态?某些页面组件具有属性headline其他teaserHeadline和其他属性title。为了避免每次尝试捕获都创建一个函数,我创建了一个循环遍历可能属性的函数,如果该属性为null,则跳过该属性。为此,我需要对不存在的属性返回null。

这是一个应该起作用的示例,但它不能(不要在您的实时系统上运行它):

import de.hybris.platform.servicelayer.search.FlexibleSearchQuery;
import de.hybris.platform.servicelayer.search.SearchResult;

flexibleSearch = spring.getBean("flexibleSearchService")

FlexibleSearchQuery query = new FlexibleSearchQuery("select {pk} from {ContentPage}");
SearchResult searchResult = flexibleSearch.search(query);

def i = 0;
def max = 1;
searchResult.result.each { page ->
    if (i < max) {
        gatherCMSPageInformation(page)
    }

    i++;
}

def gatherCMSPageInformation(page) {
    page.class.metaClass.propertyMissing() {
        null
    }

    println page.title2
}

奇怪的是,如果我以很小的间隔运行几次,它将开始工作。但是我不能将“ null”覆盖为“ a”之类的东西。我还注意到,覆盖对象类在Hybris中根本不起作用。

/编辑2:

我注意到,我正在与常规的缓存进行斗争。只需尝试第一个示例,将null更改为a,然后在相同的上下文中尝试将其再次更改为b,而无需重新启动系统。

是否有清除缓存的方法?

1 个答案:

答案 0 :(得分:0)

为什么不使用Groovy Elvis运算符?

println u?.namee ?: null