2011-08-21 37 views
0

我想在Groovy中编写自定义类型转换Category。目标是将Map的值分配给Groovy bean的字段。将来会有不同的响应类型。 Map的值始终是String类型的值,但必须转换为不同的数据类型。为了完成这项工作,我创建了一个实现名为asType的方法的Category类。这是我的代码一个简单的例子:使用带有Mixin注释的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

Mixins不能这样工作。您正在尝试将Map的方法混合到您的MyClass对象中。只有当MyClass延长Map时,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 
+0

我知道传递' Map'到一个Groovy Bean,我的示例代码被简化了,实际的bean也有其他的数据类型,比如'Integer'和'Boolean',但是我的'Map'在开始时只保存了'Strings'。将其转换为正确的数据类型 –

+0

好的,就像我在顶部所说的那样,然后使用'use'代替,我用另一个建议更新了它。 – OverZealous

+0

哎呀,在作业前忘了'this.'。第二个例子现在应该工作。 – OverZealous