Groovy   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在groovy @Canonical bean构造函数调用中添加缺少的属性?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我是groovy的新手,刚开始探索它的元编程功能.我坚持在bean构造函数@L_618_2@中添加缺少的属性.

在与FactoryBuilderSupport一起使用的类中,我想动态添加在构造函数@L_618_2@期间尚未定义和提供的那些属性.这是精简版:@H_618_7@

@Canonical
class MyClass {
    def startDate
    def additionalProperties = [:]

    def void propertymissing(String name,value) {
        additionalProperties[name] = value
    }
}

但是,如果我构造具有未知属性的类,则不会添加proprty,但我会得到@L_315_11@missingPropertyException:@H_618_7@

def thing = new MyClass(startDate: datetiR_872_11845@e.Now(),duration: 1234)

属性持续时间不存在,我预计它将通过propertymissing处理.据我所知groovy,@L_618_2@tuple-constructor会导致无参数构造函数@L_618_2@,然后@L_618_2@groovy生成的setter.那么为什么我会得到@L_315_11@missingPropertyException呢?@H_618_7@

由于我是groovy的新手,我可能缺少一些基本的AST或MOP规则.我非常感谢你的帮助.@H_618_7@

解决方法

如果您使用@Canonical并使用def定义第一个类对象,就像使用startDate一样,注释会生成以下构造函数

@Canonical
class MyClass {
    def startDate
    def additionalProperties = [:]

    def void propertymissing(String name,value) {
            additionalProperties[name] = value
    }
}

// use reflection to see the constructors
MyClass.class.getConstructors()

生成的构造函数:@H_618_7@

public MyClass() 
public MyClass(java.lang.object)
public MyClass(java.util.LinkedHashMap)
public MyClass(java.lang.object,java.lang.object)

在@Canonical documentation中,您可以看到以下限制:@H_618_7@

由于公共MyClass(java.util.LinkedHashMap)生成,您不能使用tuple-constructor,并且您得到MissingPropertyException.@H_618_7@

令人惊讶的是,如果您使用类型而不是使用def定义您的第一个对象(请注意我说第一个),@ Canon注释不会添加公共MyClass(java.util.LinkedHashMap),然后您的元组构造函数@L_618_2@工作,请参阅以下代码:@H_618_7@

@Canonical
class MyClass {
    java.util.Date startDate
    def additionalProperties = [:]

    def void propertymissing(String name,value) {
            additionalProperties[name] = value
    }
}
// get the constructors
MyClass.class.getConstructors()
// Now your code works
def thing = new MyClass(startDate: new java.util.Date(),duration: 1234)

现在创建的构造函数是:@H_618_7@

public MyClass()
public MyClass(java.util.DatE)
public MyClass(java.util.Date,java.lang.object)

因此,由于没有公共MyClass(java.util.LinkedHashMap),因此限制不适用,并且您的元组构造函数@L_618_2@有效.@H_618_7@

另外我想说,既然这个解决方案有效,我无法争辩为什么……我一次又一次地阅读@Canonical文档,我没有看到描述这种行为的部分,所以我不知道为什么以这种方式工作,我也做了一些尝试,我有点困惑,只有当第一个元素是def时,公共MyClass(java.util.LinkedHashMap)被创建,即:@H_618_7@

@Canonical
class MyClass {
    def a
    int c
}
// get the constructors
MyClass.class.getConstructors()

一个对象定义为def …@H_618_7@

public MyClass()
public MyClass(java.lang.object)
public MyClass(java.util.LinkedHashMap) // first def...
public MyClass(java.lang.object,@R_197_10185@

现在,如果我改变顺序:@H_618_7@

@Canonical
class MyClass {
    int c
    def a
}
// get the constructors
MyClass.class.getConstructors()

现在首先不是def和公共MyClass(java.util.LinkedHashMap)没有生成:@H_618_7@

public MyClass() 
public MyClass(@R_197_10185@
public MyClass(int,java.lang.object)

希望这可以帮助,@H_618_7@

大佬总结

以上是大佬教程为你收集整理的在groovy @Canonical bean构造函数调用中添加缺少的属性?全部内容,希望文章能够帮你解决在groovy @Canonical bean构造函数调用中添加缺少的属性?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。