Groovy 4.x访问伪属性触发MissingPropertyException问题求助
Groovy 4.x 访问布尔型Getter伪属性报错的解决方案
在Groovy 4.x环境下,调用new User().activated会抛出MissingPropertyException,但相同代码在Groovy 3.x中可正常运行,这是因为Groovy 4.x调整了布尔型Getter方法与伪属性的映射规则,以下是两种解决方式:
方法一:修改Getter方法名
将isActivated()改为符合Groovy 4.x默认规则的getActivated(),这样就能直接通过activated访问伪属性:
class User { Boolean getActivated() { return true } } @Test void beanPropertiesTest() { assert new User().activated // 正常运行 }
方法二:启用旧版兼容模式
如果不想修改方法名,可通过编译器参数或AST注解恢复Groovy 3.x的行为:
方式1:添加编译器参数
在编译或运行时添加参数:
-Dgroovy.boolean.getter.name.convention=legacy
方式2:使用AST注解
在目标类或测试类上添加@CompileOptions注解,指定兼容参数:
@groovy.transform.CompileOptions(compilerArgs = ['-Dgroovy.boolean.getter.name.convention=legacy']) class User { Boolean isActivated() { return true } } @Test void beanPropertiesTest() { assert new User().activated // 正常运行 }
原因说明
Groovy 4.x为了更严格遵循JavaBean规范,默认仅将getXxx()形式的Getter映射为xxx伪属性;而Groovy 3.x及更早版本中,isXxx()形式的布尔Getter会自动映射为xxx伪属性。启用legacy模式后,会恢复旧的映射逻辑。
内容的提问来源于stack exchange,提问作者kshep92
相关产品推荐
相关产品推荐

