2016-01-07 16 views
12

हमारे आरईएसटी एपीआई पेजों में परिणाम लौट रहे हैं। यहां एक नियंत्रकस्प्रिंग रेस्ट टेम्पलेट पेजिनेटेड एपीआई

@RequestMapping(value = "/search", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8") 
@ResponseStatus(HttpStatus.OK) 
public Page<MyObject> findAll(Pageable pageable) { 
    ... 
} 

क्या एक एपीआई को RestTemplate के साथ उपभोग करने का कोई आसान तरीका है?

हम

ParameterizedTypeReference<Page<MyObject>> responseType = new ParameterizedTypeReference<Page<MyObject>>() { }; 

ResponseEntity<Page<MyObject>> result = restTemplate.exchange(url, HttpMethod.GET, null/*httpEntity*/, responseType); 

List<MyObject> searchResult = result.getBody().getContent(); 

यह एक अपवाद

org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not construct instance of org.springframework.data.domain.Page, 
problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information at [Source: [email protected]; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of org.springframework.data.domain.Page, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information 

अग्रिम

उत्तर

6

कोड बाकी एपीआई प्रतिक्रिया के रूप में पढ़ने बदल दिया धन्यवाद फेंकता करते हैं; कुल तत्वों को ठीक से सेट नहीं किए गए क्योंकि

ParameterizedTypeReference<RestResponsePage<MyObject>> responseType = new ParameterizedTypeReference<RestResponsePage<MyObject>>() { }; 

ResponseEntity<RestResponsePage<MyObject>> result = restTemplate.exchange(url, HttpMethod.GET, null/*httpEntity*/, responseType); 

List<MyObject> searchResult = result.getBody().getContent(); 

और यहाँ, वर्ग मैं RestResponsePage

package com.basf.gb.cube.seq.vaadinui.util; 

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.data.domain.PageImpl; 
import org.springframework.data.domain.Pageable; 

public class RestResponsePage<T> extends PageImpl<T>{ 

    private static final long serialVersionUID = 3248189030448292002L; 

    public RestResponsePage(List<T> content, Pageable pageable, long total) { 
    super(content, pageable, total); 
    // TODO Auto-generated constructor stub 
    } 

    public RestResponsePage(List<T> content) { 
    super(content); 
    // TODO Auto-generated constructor stub 
    } 

    /* PageImpl does not have an empty constructor and this was causing an issue for RestTemplate to cast the Rest API response 
    * back to Page. 
    */ 
    public RestResponsePage() { 
    super(new ArrayList<T>()); 
    } 

} 
+0

क्यों अशक्त httpEntity में पारित: यू पेज मेटाडाटा (क्या आप "page" खंड में मिलता है), लिंक ("_links" अनुभाग) और सामग्री का उपयोग करने में सक्षम हो जाएगा? शून्य/* httpEntity */ –

+0

यह पृष्ठों की सही संख्या या परिणामों की कुल संख्या वापस नहीं करता है। – ACOMIT001

0

समाधान तैनात मेरे लिए काम नहीं किया के लिए बनाई गई है। मैंने पृष्ठ को एक प्रतिनिधि पैटर्न के साथ कार्यान्वित किया, जो मेरे लिए काम करता था। यहां कामकाजी कोड है:

import org.springframework.core.convert.converter.Converter; 
import org.springframework.data.domain.Page; 
import org.springframework.data.domain.PageImpl; 
import org.springframework.data.domain.Pageable; 
import org.springframework.data.domain.Sort; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

public class RestPage<T> implements Page<T> { 
    private PageImpl<T> pageDelegate = new PageImpl<>(new ArrayList<>(0)); 

    public List<T> getContent() { 
     return pageDelegate.getContent(); 
    } 

    public int getNumber() { 
     return pageDelegate.getNumber(); 
    } 

    public int getNumberOfElements() { 
     return pageDelegate.getNumberOfElements(); 
    } 

    public int getSize() { 
     return pageDelegate.getSize(); 
    } 

    public Sort getSort() { 
     return pageDelegate.getSort(); 
    } 

    public long getTotalElements() { 
     return pageDelegate.getTotalElements(); 
    } 

    public int getTotalPages() { 
     return pageDelegate.getTotalPages(); 
    } 

    public boolean hasContent() { 
     return pageDelegate.hasContent(); 
    } 

    public boolean hasNext() { 
     return pageDelegate.hasNext(); 
    } 

    public boolean hasPrevious() { 
     return pageDelegate.hasPrevious(); 
    } 

    public boolean isFirst() { 
     return pageDelegate.isFirst(); 
    } 

    public boolean isLast() { 
     return pageDelegate.isLast(); 
    } 

    public Iterator<T> iterator() { 
     return pageDelegate.iterator(); 
    } 

    public <S> Page<S> map(Converter<? super T, ? extends S> converter) { 
     return pageDelegate.map(converter); 
    } 

    public Pageable nextPageable() { 
     return pageDelegate.nextPageable(); 
    } 

    public Pageable previousPageable() { 
     return pageDelegate.previousPageable(); 
    } 

    public void setContent(List<T> content) { 
     pageDelegate = new PageImpl<>(content, null, getTotalElements()); 
    } 


    public void setTotalElements(int totalElements) { 
     pageDelegate = new PageImpl<>(getContent(), null, totalElements); 
    } 

    public String toString() { 
     return pageDelegate.toString(); 
    } 
} 
+0

यह केवल 1-Arg कन्स्ट्रक्टर के लिए केस को संभालता है। यदि आपके पास 3-Arg कन्स्ट्रक्टर था, तो इसका कोई उपयोग नहीं है। – cst1992

+1

कुल फ़ील्ड कुल सामग्री और सामग्री को छोड़कर उपरोक्त कोड के साथ पॉप्युलेट नहीं किए गए हैं। – MasterCode

6

उपरोक्त विस्तार पर, लेकिन प्रत्येक संपत्ति को लागू करने की आवश्यकता के बिना।

import com.fasterxml.jackson.annotation.JsonCreator; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import org.springframework.data.domain.PageImpl; 
import org.springframework.data.domain.PageRequest; 
import org.springframework.data.domain.Pageable; 

import java.util.ArrayList; 
import java.util.List; 

public class RestPageImpl<T> extends PageImpl<T>{ 

    @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) 
    public RestPageImpl(@JsonProperty("content") List<T> content, 
         @JsonProperty("number") int page, 
         @JsonProperty("size") int size, 
         @JsonProperty("totalElements") long total) { 
     super(content, new PageRequest(page, size), total); 
    } 

    public RestPageImpl(List<T> content, Pageable pageable, long total) { 
     super(content, pageable, total); 
    } 

    public RestPageImpl(List<T> content) { 
     super(content); 
    } 

    public RestPageImpl() { 
     super(new ArrayList()); 
    } 
} 
2

Page को लागू करने की कोई आवश्यकता नहीं है। आपको अपने ParameterizedTypeReference में एक प्रकार के रूप में PagedResources<T> का उपयोग करना होगा।

तो आपकी सेवा रिटर्न के लिए इसी तरह की प्रतिक्रिया करता है, तो (वस्तुओं संक्षिप्तता के लिए निकाल दिए जाते हैं):

ResponseEntity<PagedResources<Event>> eventsResponse = restTemplate.exchange(uriBuilder.build(true).toUri(), 
       HttpMethod.GET, null, new ParameterizedTypeReference<PagedResources<Event>>() {}); 
:

{ 
    "_embedded": { 
     "events": [ 
      {...}, 
      {...}, 
      {...}, 
      {...}, 
      {...} 
     ] 
    }, 
    "_links": { 
     "first": {...}, 
     "self": {...}, 
     "next": {...}, 
     "last": {...} 
    }, 
    "page": { 
     "size": 5, 
     "totalElements": 30, 
     "totalPages": 6, 
     "number": 0 
    } 
} 

और वस्तुओं आप परवाह प्रकार Event के हैं तो आप की तरह अनुरोध को निष्पादित करना चाहिए

यदि आप संसाधनों को पकड़ते हैं जैसे:

PagedResources<Event> eventsResources = eventsResponse.getBody(); 

यो

Collection<Event> eventsCollection = eventsResources.getContent(); 
संबंधित मुद्दे