我想在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
}
}
有人知道为什么使用注释无法正常工作吗?
答案 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