2011-12-14 2 views
5

저는 Spring의 RestTemplate을 사용하여 REST 웹 서비스를 호출합니다. 이러한 호출 중 하나는 특정 유형의 객체 목록을 반환하는 것입니다. RestTemplate 메서드는 예상되는 반환 형식을 나타 내기 위해 클래스 인수를 제공해야합니다.제네릭 형식 정보를 사용할 수 없을 때 컴파일러 경고를 피하는 방법은 무엇입니까?

// restTemplate is type org.springframework.web.client.RestTemplate 
URI restServiceURI = new URI("http://example.com/foo") 
restTemplate.getForObject(restServiceURI, List<Foo>.class); 

분명히 이것은 컴파일되지 않습니다. 이와 같이 형식 인수를 제공하면 고정 .class 속성을 가져올 수 없습니다. 형식 인수를 제거하면 코드가 컴파일되지만 rawtypes 컴파일러 경고가 생성됩니다.

내 질문에 간단합니다. 내가 컴파일러 경고를 억제하거나 붙어 있나이 코드를 청소기 방법이 무엇입니까? 당신은 사용하여 달성 할 수

답변

3

그러나 RestTemplate 방법을 알 것 목록 요소를 Foo 클래스의 인스턴스로 변환 하시겠습니까? 코드를 실행 해 보셨습니까? 예상대로 작동합니까?

이 방법을 생각해 볼 수있는 한 가지 방법은 입력 유형으로 배열을 사용하는 것입니다. 예.

restTemplate.getForObject(restServiceURI, Foo[].class); 

그러나 지원되는지는 확실하지 않습니다. 보다 복잡한 데이터 유형을 병렬화해야하는 경우에는 Jackson 또는 Gson 사용을 고려해야합니다.

잭슨을 사용하면 ObjectMapper 클래스를 사용하여 대부분의 소스에서 쉽게 데이터를 역 직렬화 할 수 있습니다. 의도적 TypeReference를 확장 익명 클래스를 생성하기 때문에

String input = ...; 
ObjectMapper mapper = new ObjectMapper(); 
List<Foo> list = mapper.readValue(input, new TypeReference<List<Foo>>(){}); 

위의 작품, 클래스는 실행시의 일반적인 유형을 기억하고 그래서 푸의 목록을 만들 수있는 객체 매퍼를 할 수 있습니다. For a fuller explanation.

+0

Jackson은 classpath에 있고, Spring 3.x는 자동적으로 그것을 사용하여 스트림을 마샬링/언 마샬링합니다. 저에게 유리하게 활용하고 싶었지만 낮은 수준에서이 작업을 수행해야합니다. Spring이 다른 템플릿 클래스와 마찬가지로 Collection 반환을 처리하는 쉬운 방법을 제공하지 않았다는 것에 놀랐습니다. –

+0

이 방법은 세부 조정과 함께 작동합니다. RestTemplate.getForObject()를 사용하는 대신 RestTemplate.execute()를 사용하고 자체 ResponseExtractor를 제공합니다. 이것은 개념 증명을 통해 나를 얻지 만 서버에서 응답 유형을 결정하는 더 영리한 방법이 있다고 생각합니다. 지금 당장 JSON을 사용하고 있지만 XML을 지원해야 할 필요가 있습니다. 방향 주셔서 감사합니다! –

0

이 :

List<Class<Foo>> classList = new ArrayList<Class<Foo>>(); 
restTemplate.getForObject(restServiceURI, classList); 

그 다음 당신은 그냥 같이 전달할 수있는 하나의 객체와 클래스의하지 목록 경우 :

restTemplate.getForObject(restServiceURI, Foo.class); 
+0

제안 된 방법은 컴파일 오류를 발생시킵니다. –

관련 문제