英文:
Accessing pseudo properties with Groovy 4.x throws a MissingPropertyException
问题
当我尝试访问以下类的activated
伪属性时,在Groovy 4.x上出现了MissingPropertyException
:
@Test
void beanPropertiesTest() {
assert new User().activated // Fails
}
class User {
Boolean isActivated() {
return true
}
}
但在Groovy 3.x上,代码正常工作。是否需要设置AST注解或编译器标志?
我使用的是Java 17。
英文:
When I try to access the activated
pseudo property on the following class, I get a MissingPropertyException
on Groovy 4.x:
@Test
void beanPropertiesTest() {
assert new User().activated // Fails
}
class User {
Boolean isActivated() {
return true
}
}
The code works fine on Groovy 3.x though. Is there an AST annotation or compiler flag that I need to set?
I'm on Java 17.
答案1
得分: 1
在经过长时间搜索后,我相信我已经找到了解决方案,那就是将返回类型从 Boolean
更改为 boolean
。 4.0.0 变更日志 引用了 此 JIRA 问题,其中包含 Eric Miles 的 这个评论:
> 返回任何其他类型的“is”方法都不是属性访问器。
进一步阅读揭示了他所说的“任何其他类型”指的是原始的 boolean
以外的任何其他类型,如 Paul King 在 这里 进一步解释的那样。
GitHub 上的以下拉取请求巩固了更改,推荐使用 isName()
而不是 getName()
用于 boolean
访问器:
GROOVY-9382,GROOVY-10133:更喜欢为 boolean 使用 isName()
现在,Boolean
访问器将不得不使用 getName()
,以便与 JavaBean 规范(参见:Introspection 8.3.2)正确对齐。
英文:
After hours of searching, I believe I have found that the solution is to change the return type from Boolean
to boolean
. The 4.0.0 change log referenced this JIRA issue with this comment from Eric Miles:
> An “is” method that returns any other type is not a property accessor.
Further reading revealed that by "any other type" he meant any other type than the primitive boolean
, as further explained by Paul King here.
The following pull request on GitHub cemented the change to prefer isName()
over getName()
for boolean
accessors:
GROOVY-9382, GROOVY-10133: prefer isName() over getName() for boolean
Boolean
accessors will now have to use getName()
to properly align it with the JavaBean specification (See: Introspection 8.3.2).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论