2011-08-21 3 views
0

Groovy에 사용자 정의 유형 변환 Category을 작성하고 싶습니다. 목표는 Map의 값을 Groovy bean의 필드에 지정하는 것입니다. 앞으로는 다양한 응답 유형이있을 것입니다. Map의 값은 항상 String 유형이지만 다른 데이터 유형으로 변환해야합니다. 이 작업을 수행하기 위해 asType이라는 메소드를 구현하는 Category 클래스를 만들었습니다. 나는 use 키워드를 사용하여 범주를 적용 할 때 때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 
} 

이 잘 작동이 내 코드의 간단한 예입니다. 내가 대신 @Mixin 주석을 사용하려고하면

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

그러나 제대로 작동하지 않는 것 같습니다. 올바른 응답 유형이 있지만 모든 필드는 null입니다.

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

주석을 사용하여 올바르게 작동하지 않는 이유를 아는 사람이 있습니까?

답변

0

믹스는 그렇게 작동하지 않습니다. MyClass 개체에 Map의 방법을 혼합하려고합니다. 믹스 인은 MyClassMap으로 확장 한 경우에만 작동합니다.

대신에 보통과 같이 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 웹 사이트가 손상된 것으로 나타나고 코드 예제를 찾을 수 없습니다. :-(

는 편집 : 또 다른 제안

대신의 모든 범주를 사용하여, 당신은 왜 빈 자체가 그것을 처리하지 않습니다

@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

과제 앞에서 '이.'를 잊어 버렸습니다. 두 번째 예제는 이제 작동합니다. – OverZealous

관련 문제