Dynamic 使用带Mixin注释的asType
我想用Groovy编写一个自定义类型转换。目标是将映射的值分配给groovybean的字段。将来会有不同的响应类型。映射的值始终为String类型,但必须转换为其他数据类型。为了实现这一点,我创建了一个Category类,它实现了一个名为asType的方法。这是我的代码的一个简化示例:Dynamic 使用带Mixin注释的asType,dynamic,groovy,metaprogramming,categories,mixins,Dynamic,Groovy,Metaprogramming,Categories,Mixins,我想用Groovy编写一个自定义类型转换。目标是将映射的值分配给groovybean的字段。将来会有不同的响应类型。映射的值始终为String类型,但必须转换为其他数据类型。为了实现这一点,我创建了一个Category类,它实现了一个名为asType的方法。这是我的代码的一个简化示例: class MapCategory { static Object asType(Map self, Class clazz) { if(clazz == Response) {
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关键字应用类别时,这种方法非常有效
然而,当我尝试使用@Mixin注释时,它似乎无法正常工作。我得到了正确的响应类型,但所有字段都为空
有人知道为什么使用注释时它不能正常工作吗?mixin不能这样工作。您正试图将Map的方法混合到MyClass对象中。只有在MyClass扩展映射时,mixin才会工作 相反,您希望像普通一样使用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的一个内置特性
当然,如果您需要比仅仅分配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
我知道如何将地图传递给Groovy Bean。我的示例代码被简化了。实际的bean还有其他数据类型,如整数和布尔值。但是,我的地图只在开头包含字符串。在我的分类中,我会将其转换为正确的数据类型。好吧,就像我在顶部所说的,然后使用。或者,我用另一个建议更新了它。哎呀,忘了这个。在作业前。第二个例子现在应该可以了。我想我只需要手动设置字段,而不是使用类别。
@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.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