স্প্রিং রেস্টটেম্পলেট সহ জেএসএন বস্তুর তালিকা পান


199

আমার দুটি প্রশ্ন আছে:

  • স্প্রিং রেস্টটেম্পলেট ব্যবহার করে কীভাবে JSON অবজেক্টের একটি তালিকা ম্যাপ করবেন।
  • নেস্টেড জেএসওএন অবজেক্টগুলিকে কীভাবে ম্যাপ করবেন।

আমি http://spring.io/guides/gs/consuming-rest/ থেকে টিউটোরিয়াল অনুসরণ করে https://bitpay.com/api/rates গ্রাস করার চেষ্টা করছি ।


2
এই উত্তরটি দেখুন বিবেচনা করুন, বিশেষ করে যদি আপনি ব্যবহার জেনেরিক্স তালিকা চান stackoverflow.com/questions/36915823/...
Moesio

উত্তর:


220

সম্ভবত এইভাবে ...

ResponseEntity<Object[]> responseEntity = restTemplate.getForEntity(urlGETList, Object[].class);
Object[] objects = responseEntity.getBody();
MediaType contentType = responseEntity.getHeaders().getContentType();
HttpStatus statusCode = responseEntity.getStatusCode();

জন্য নিয়ামক কোড RequestMapping

@RequestMapping(value="/Object/getList/", method=RequestMethod.GET)
public @ResponseBody List<Object> findAllObjects() {

    List<Object> objects = new ArrayList<Object>();
    return objects;
}

ResponseEntityএটি একটি এক্সটেনশন HttpEntityযা একটি HttpStatusস্থিতি কোড যুক্ত করে। RestTemplateপাশাপাশি @Controllerপদ্ধতিতে ব্যবহৃত হয় । ইন RestTemplateএই শ্রেণীর দ্বারা ফিরিয়ে দেওয়া হয় getForEntity()এবং exchange()


এটি একটি মোহন মত কাজ করেছে, আপনাকে ধন্যবাদ। হতে পারে আপনি আমাকে অন্য কয়েকটি টিউটোরিয়াল বা গাইড সম্পর্কে গাইড করতে পারেন যা আমি এই বিষয়টিতে পড়তে পারি?
করুদি

2
কিছু কোড স্নিপেট এবং উদাহরণগুলির জন্য স্ট্যাকওভারফ্লোতে এখানে দেখতে বা অফিশিয়াল স্প্রিং ওয়েবসাইটটি দেখার জন্য সেরা ...... টিবিএলজিপিএস [] এ = প্রতিক্রিয়াপ্রসূততা.সেটবিডি ();
কমোকজে

জেনেরিক ব্যবহার করে এটি কি সম্ভব? অর্থ্যাৎ আমার পদ্ধতিতে ক্লাস <টি বিস্তৃত ফু> প্যারামিটার রয়েছে এবং আমি getForEntity পদ্ধতি থেকে টি সংগ্রহ করতে চাই।
ডিস্কুট্যান্ট

হ্যাঁ এটি কার্যকর হওয়া উচিত, তবে আপনার বসন্ত / জ্যাকসন সংস্করণ এবং আপনার শ্রেণীর ধরণের উপর নির্ভর করে বাক্সের বাইরে নাও থাকতে পারে। জেনেরিকগুলি সিরিয়ালাইজেশন / ডিজাইরিয়ালাইজ করা সম্পর্কে - HTTP রিকোয়েস্টটি কী পরিবহণ করা হয় তা যত্নশীল নয়।
কামোকাজে


335

অ্যারেতে ফিরে আসার সত্তা ধরে রাখতে প্রথমে কোনও সংজ্ঞা নির্ধারণ করুন .. যেমন

@JsonIgnoreProperties(ignoreUnknown = true)
public class Rate {
    private String name;
    private String code;
    private Double rate;
    // add getters and setters
}

তারপরে আপনি পরিষেবাটি গ্রাস করতে পারবেন এবং এর মাধ্যমে দৃ strongly়ভাবে টাইপ করা তালিকা পেতে পারেন:

ResponseEntity<List<Rate>> rateResponse =
        restTemplate.exchange("https://bitpay.com/api/rates",
                    HttpMethod.GET, null, new ParameterizedTypeReference<List<Rate>>() {
            });
List<Rate> rates = rateResponse.getBody();

উপরের অন্যান্য সমাধানগুলিও কাজ করবে, তবে আমি কোনও অবজেক্ট [] এর পরিবর্তে দৃ strongly়ভাবে টাইপ করা তালিকা ফিরে পেতে পছন্দ করি।


6
স্প্রিং ৪.২.৩ এর সাথে এই রানটি সহজেই চলছে - এবং ম্যাট যেমনটি বলেছে
অবজেক্টটি

@ ম্যাট - আপনি কোন মার্শালার জেসনকে রেট অবজেক্টে মার্শাল করতে ব্যবহার করছেন? আমি অনুমান করছি যে এখানে কী ঘটছে, restTemplate.exchangeমার্শালারটির সময় সমস্ত জেসন মানগুলি রেট অবজেক্টের বৈশিষ্ট্য হিসাবে মিলে যাওয়া মূল নামের সাথে মানচিত্র তৈরি করে। আশা করি আমার চিন্তার প্রক্রিয়াটি ঠিক আছে।
নির্মল

পারফেক্ট, ইন স্প্রিং বুট 1.4.0.RELEASE ধন্যবাদ কাজ করে জরিমানা
আনন্দ

1
@ নির্মল স্প্রিং জ্যাকসনকে ডিফল্টরূপে ব্যবহার করে আমার বিশ্বাস।
সোহাইব

1
@ সরবার্নিশনবোয়েভ বর্তমানের প্যারামিটারাইজড টাইপ রেফারেন্সটি স্প্রিংফ্রেমে ওয়ার্কপোর থেকে এখনও ঠিক আছে: ডকসস.স্প্রিং.আইও
স্প্রিং-

75

আমার জন্য এটি কাজ করেছে

Object[] forNow = template.getForObject("URL", Object[].class);
    searchList= Arrays.asList(forNow);

যেখানে বস্তুটি আপনি চান শ্রেণি


16
এমনকি কাজ করে তোমার মত একটি বর্গ এবং অবজেক্ট ব্যবহারCoupon[] coupons = restTemplate.getForObject( url, Coupon[].class)
lrkwz

1
এইচটিটিপি প্রতিক্রিয়া বডি খালি থাকলে ( []পুরোপুরি খালি নয়) এটি এনপিইর কারণ হতে পারে । সুতরাং সাবধান এবং null( if (forNow != null)...) জন্য পরীক্ষা করুন ।
রুসলান স্টেলমাচেঙ্কো

1
আমার গাধা বাঁচিয়েছেন: ভাবছেন যে জ্যাকসন কোন ধরণের পদ্ধতি ব্যবহার করেছেন, যখন Object.classপদ্ধতিতে নির্দিষ্ট করা হয়েছে getForObject()
এরিক ওয়াং

5

একাধিক পরীক্ষার পরে, এটি আমি খুঁজে পেয়েছি সেরা উপায় :)

Set<User> test = httpService.get(url).toResponseSet(User[].class);

আপনার সেখানে সমস্ত প্রয়োজন

public <T> Set<T> toResponseSet(Class<T[]> setType) {
    HttpEntity<?> body = new HttpEntity<>(objectBody, headers);
    ResponseEntity<T[]> response = template.exchange(url, method, body, setType);
    return Sets.newHashSet(response.getBody());
}

দ্রষ্টব্য: এটির জন্য পেয়ারা প্রয়োজন
vphilipnyc

2

আমার এখানে বড় সমস্যাটি ছিল সামঞ্জস্যপূর্ণ ক্লাসের সাথে রেস্টটেম্প্লেটের সাথে মেলে প্রয়োজনীয় অবজেক্ট কাঠামোটি তৈরি করা। ভাগ্যক্রমে আমি http://www.jsonschema2pojo.org/ খুঁজে পেয়েছি (একটি ব্রাউজারে জেএসওএন প্রতিক্রিয়া পান এবং এটি ইনপুট হিসাবে ব্যবহার করুন) এবং আমি এটি যথেষ্ট সুপারিশ করতে পারি না!


2

আমি আমার প্রোজেক্টগুলির একটির জন্য কার্যত কিছু আগেই সরিয়ে নিয়েছি এবং কোডটি এখানে রয়েছে:

/**
 * @param url             is the URI address of the WebService
 * @param parameterObject the object where all parameters are passed.
 * @param returnType      the return type you are expecting. Exemple : someClass.class
 */

public static <T> T getObject(String url, Object parameterObject, Class<T> returnType) {
    try {
        ResponseEntity<T> res;
        ObjectMapper mapper = new ObjectMapper();
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
        restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
        ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setConnectTimeout(2000);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<T> entity = new HttpEntity<T>((T) parameterObject, headers);
        String json = mapper.writeValueAsString(restTemplate.exchange(url, org.springframework.http.HttpMethod.POST, entity, returnType).getBody());
        return new Gson().fromJson(json, returnType);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

/**
 * @param url             is the URI address of the WebService
 * @param parameterObject the object where all parameters are passed.
 * @param returnType      the type of the returned object. Must be an array. Exemple : someClass[].class
 */
public static <T> List<T> getListOfObjects(String url, Object parameterObject, Class<T[]> returnType) {
    try {
        ObjectMapper mapper = new ObjectMapper();
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
        restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
        ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setConnectTimeout(2000);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<T> entity = new HttpEntity<T>((T) parameterObject, headers);
        ResponseEntity<Object[]> results = restTemplate.exchange(url, org.springframework.http.HttpMethod.POST, entity, Object[].class);
        String json = mapper.writeValueAsString(results.getBody());
        T[] arr = new Gson().fromJson(json, returnType);
        return Arrays.asList(arr);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

আমি আশা করি এটি কারও সাহায্য করবে!


1

আপনি যদি অবজেক্টের একটি তালিকা পছন্দ করেন তবে এটি করার একটি উপায় এটি:

public <T> List<T> getApi(final String path, final HttpMethod method) {     
    final RestTemplate restTemplate = new RestTemplate();
    final ResponseEntity<List<T>> response = restTemplate.exchange(
      path,
      method,
      null,
      new ParameterizedTypeReference<List<T>>(){});
    List<T> list = response.getBody();
    return list;
}

এবং এটি এর মতো ব্যবহার করুন:

 List<SomeObject> list = someService.getApi("http://localhost:8080/some/api",HttpMethod.GET);

উপরের জন্য ব্যাখ্যা এখানে পাওয়া যাবে ( https://www.baeldung.com/spring-rest-template-list ) এবং নীচে প্যারাফ্রেস করা হয়।

"উপরের কোডটিতে বেশ কয়েকটি জিনিস ঘটছে First প্রথমে আমরা আমাদের রিটার্ন টাইপ হিসাবে রেসপন্সএন্টিটি ব্যবহার করি, এটি ব্যবহার করে আমরা সত্যিকার অর্থে অবজেক্টের তালিকা মোড়ানোর জন্য ব্যবহার করি। দ্বিতীয়ত, আমরা getforObject () এর পরিবর্তে রেস্টটেম্পলেট.এক্সচেঞ্জ () কল করছি) ।

এটি রেস্টস্টেমলেট ব্যবহারের সর্বাধিক জেনেরিক উপায়। এটিতে আমাদের HTTP পদ্ধতি, requestচ্ছিক অনুরোধের বডি এবং একটি প্রতিক্রিয়ার ধরণ উল্লেখ করা দরকার requires এই ক্ষেত্রে, আমরা প্রতিক্রিয়ার ধরণের জন্য প্যারামিটারাইজড টাইপরিফারেন্সের একটি বেনামে সাবক্লাস ব্যবহার করি।

এই শেষ অংশটিই আমাদের JSON প্রতিক্রিয়াটিকে উপযুক্ত ধরণের বস্তুর তালিকায় রূপান্তর করতে দেয়। আমরা যখন প্যারামিটারাইজড টাইপরিফারেন্সের একটি বেনামে সাবক্লাস তৈরি করি, তখন আমরা আমাদের প্রতিক্রিয়ায় রূপান্তর করতে চাই এমন শ্রেণীর প্রকারের তথ্য ক্যাপচারের জন্য এটি প্রতিবিম্বটি ব্যবহার করে।

এটি জাভা টাইপ অবজেক্ট ব্যবহার করে এই তথ্য ধরে রাখে এবং আমাদের আর ধরণের ক্ষয় সম্পর্কে চিন্তা করতে হবে না। "



1

আপনি প্রতিটি প্রবেশের জন্য POJO তৈরি করতে পারেন,

class BitPay{
private String code;
private String name;
private double rate;
}

তারপরে প্যারামিটারাইজড টাইপ ব্যবহার করে বিটপেয়ের তালিকার রেফারেন্স হিসাবে আপনি এটি ব্যবহার করতে পারেন:

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<List<Employee>> response = restTemplate.exchange(
  "https://bitpay.com/api/rates",
  HttpMethod.GET,
  null,
  new ParameterizedTypeReference<List<BitPay>>(){});
List<Employee> employees = response.getBody();

-1

আমি এই পোস্টটি থেকে https://jira.spring.io/browse/SPR-8263 থেকে কাজ খুঁজে পেয়েছি ।

এই পোস্টের উপর ভিত্তি করে আপনি এই জাতীয় টাইপ করা তালিকাটি ফিরে আসতে পারেন:

ResponseEntity<? extends ArrayList<User>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<User>>)ArrayList.class, userId);

4
এটি কাজ করবে না, কারণ মুছে ফেলার কারণে কোনও ধরণের প্যারামিটার তথ্য দেওয়া হয় না getForEntity। এছাড়াও (Class<? extends ArrayList<User>>) ArrayList.classএকটি "বেমানান ধরনের" কম্পাইল এরর দেয়।
এসকো লুন্তটোলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.