2016-11-22 172 views
0

消耗我有一個控制器類它公開了一個方法,並返回對象作爲流(的java 8)Stream對象在寧靜的web服務通過並經由resttemplate

@RequestMapping(value = { "/book/class/{class}"},method =  RequestMethod.GET) 
@ApiOperation(response = Book.class, responseContainer="List", value =  "Get all books of a class") 
public Stream<Book> getBooksForAllClass(@PathVariable("class") String class) { 
    return myService.getBooksForClass().map(book -> Book.createBuilder().withBook(); 
    } 

復位服務消費者客戶端我需要得到的流對象並將其存儲到列表中。因此,

List<Book> books = Lists.newArrayList(); 
RestTemplate restTemplate = new RestTemplate(); 
String resourceUri = String.format("%s/%s", serviceUrl, "class_a"); 
Book[] arrayOfBooks = restTemplate.getForObject(resourceUri, Book[].class); 
books.addAll(Arrays.asList(arrayOfBooks)); 

這似乎並不奏效。有沒有什麼辦法通過resttemplate來使用流對象?

+0

看看javax.ws.rs.container.AsyncResponse – Bharath

回答

0

有一個在你的休息控制器和客戶端類型之間的不匹配。所以,你必須public Stream<Book> getBooksForAllClassrestTemplate.getForObject(resourceUri, Book[].class);; Stream<Book> VS Book[]。如果你想在你的客戶端獲得一系列書籍,你必須首先將你的流轉換爲一個數組。 stream().toArray(Book[]::new)

而且你應該避免流序列化,因爲它是操作的單次使用鏈,決不意味着是持久的。如果您將終端操作應用於您的流,您將無法再次重新使用該流。使用List<Book>Book[]會在這種情況下,更好的選擇。