2011-12-14 9 views
5

Tôi đang sử dụng số RestTemplate của Spring để thực hiện cuộc gọi đối với dịch vụ web REST. Một trong các cuộc gọi này là trả về một danh sách các đối tượng thuộc một loại nhất định. Các phương thức RestTemplate yêu cầu một đối số lớp được cung cấp để biểu thị kiểu trả về dự kiến.Làm cách nào để tránh cảnh báo trình biên dịch khi thông tin loại chung không khả dụng?

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

Rõ ràng, điều này không biên dịch. Bạn không thể nhận được thuộc tính tĩnh .class khi bạn cung cấp đối số kiểu như vậy. Mã biên dịch khi tôi loại bỏ đối số kiểu, nhưng tạo ra cảnh báo trình biên dịch rawtypes.

Câu hỏi của tôi rất đơn giản. Tôi có bị mắc kẹt với việc ngăn chặn cảnh báo trình biên dịch hoặc có cách dọn dẹp mã cho việc này không?

Trả lời

3

Nhưng làm thế nào các RestTemplate sẽ biết thế nào để chuyển đổi các phần tử danh sách thành các thể hiện của lớp Foo? Bạn đã thử chạy mã, và nó hoạt động như mong đợi?

Một cách tôi có thể nghĩ đến việc làm tròn điều này sẽ là sử dụng một mảng làm kiểu đầu vào. ví dụ.

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

Nhưng tôi không biết điều đó có được hỗ trợ hay không. Nếu bạn thực sự cần phải deserialise các loại dữ liệu phức tạp hơn thì bạn nên xem xét việc sử dụng Jackson hoặc Gson.

Với Jackson, bạn có thể sử dụng lớp ObjectMapper để dễ dàng deserialise dữ liệu từ hầu hết các nguồn.

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

Các công trình trên vì bạn cố ý tạo ra một lớp vô danh mà kéo dài TypeReference, lớp sẽ nhớ kiểu generic của nó trong thời gian chạy và do đó nó có thể giúp các mapper đối tượng để tạo danh sách Foo. For a fuller explanation.

+0

Jackson đang ở trên classpath và Spring 3.x sử dụng nó tự động để marshall/unmarshall những luồng đó. Tôi đã hy vọng tận dụng được lợi thế của mình, nhưng có vẻ như tôi cần phải làm điều này ở mức thấp hơn. Tôi chỉ ngạc nhiên rằng Spring đã không cung cấp một cách dễ dàng để xử lý Collection trả về giống như với các lớp mẫu khác. –

+0

Phương pháp này hoạt động, với một sàng lọc. Thay vì sử dụng RestTemplate.getForObject() tôi đang sử dụng RestTemplate.execute() và cung cấp ResponseExtractor của riêng tôi. Điều này giúp tôi vượt qua bằng chứng về khái niệm, nhưng tôi tưởng tượng có một cách thông minh hơn để xác định loại phản hồi từ máy chủ. Ngay bây giờ tôi giả sử JSON, nhưng tôi sẽ cần hỗ trợ XML tại một số điểm. Cảm ơn sự chỉ đạo! –

0

Bạn có thể đạt được bằng này:

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

Nếu nó chỉ là một đối tượng và không phải là một danh sách các lớp sau đó bạn chỉ có thể vượt qua như thế này:

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

Phương pháp được đề xuất của bạn cung cấp các lỗi biên dịch. –