使用带有Mixin注释的asType

时间:2011-08-21 14:47:05

标签: dynamic groovy metaprogramming categories mixins

我想在Groovy中编写自定义类型转换Category。目标是将Map的值分配给Groovy bean的字段。将来会有不同的响应类型。 Map的值始终为String类型,但必须转换为不同的数据类型。为了完成这项工作,我创建了一个Category类,它实现了一个名为asType的方法。这是我的代码的简化示例:

class MapCategory {
    static Object asType(Map self, Class clazz) {
        if(clazz == Response) {
            Response response = new Response()

            self.each { key, value ->
                response.setProperty(key, value)
            }

            return response
        }

        DefaultGroovyMethods.asType(self, clazz)
    }
}

class Response {
    String result
    String message
}

当我使用use关键字应用类别时,此功能正常。

use(MapCategory) {
    println [result: 'OK', message: 'Success'] as Response
}

但是,当我尝试使用@Mixin注释时,它似乎无法正常工作。我得到了正确的响应类型,但所有字段都是null

@Mixin(MapCategory)
class MyClass {
    def printResponse() {
        println [result: 'OK', message: 'Success'] as Response    
    }
}

有人知道为什么使用注释无法正常工作吗?

1 个答案:

答案 0 :(得分:0)

Mixins无法正常工作。您正尝试将Map的方法混合到MyClass对象中。 mixin仅在MyClass展开Map时才有效。

相反,您希望像普通一样使用use关键字,只需将您的类别用作类别。

或者,您可能根本不需要它。您是否知道,默认情况下,您可以在没有额外代码的情况下将任何地图转换为任何GroovyBean?只需使用基于地图的构造函数,如下所示:

@groovy.transform.Canonical // Groovy 1.8, just added for automatic toString method
class Response {
    String result
    String message
}

println new Response([result: 'OK', message: 'Success'])
println([result: 'bad', message: 'blah'] as Response)

注意,自动地图转换可以双向工作。这是Groovy的内置功能。<​​/ p>

当然,如果你需要比分配bean属性更复杂的东西,这将无济于事。

注意:我会给你一个链接,但是Groovy网站似乎已经破了,我找不到代码示例。 : - (

编辑:另一个建议

根本不使用类别,为什么不让bean自己处理它:

@groovy.transform.Canonical
class Response {
    String result
    String message
    int num

    public void setNum(String num) {
       this.num = Integer.parseInt(num) 
    }
}

def map = [result: 'OK', message: 'Success', num: '35' ]

println map as Response