복붙노트

[SPRING] Spring 3 START_ARRAY 토큰에서 객체의 인스턴스를 deserialize 할 수 없습니다. REST Webservice

SPRING

Spring 3 START_ARRAY 토큰에서 객체의 인스턴스를 deserialize 할 수 없습니다. REST Webservice

이 멋진 것을 사용하고 있습니다. Spring 제공 : Spring RESTWebService (Spring의 버전은 3입니다.) 브라우저에서 URL에 액세스하면 JSON 응답을 볼 수 있지만 클라이언트 엔드 포인트 (Android 애플리케이션)에서 다음 오류 메시지가 표시됩니다.

Caused by: org.springframework.web.client.ResourceAccessException: 
    I/O error: Can not deserialize instance of MyObject out of START_ARRAY token
  at [Source: org.apache.http.conn.EofSensorInputStream@4076e940; line: 1, 
    column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: 
    Can not deserialize instance of MyObject  out of START_ARRAY token
  at [Source: org.apache.http.conn.EofSensorInputStream@4076e940; line: 1, column: 1]
   at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:466)
   at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:414)
   at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:234)
   at com.be.android.locateconsultants.resources.AsyncTaskRESTServiceCaller.doInBackground(AsyncTaskRESTServiceCaller.java:43)
   at com.be.android.locateconsultants.resources.AsyncTaskRESTServiceCaller.doInBackground(AsyncTaskRESTServiceCaller.java:1)
   at android.os.AsyncTask$2.call(AsyncTask.java:252)
   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
   ... 4 more

 Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize 
    instance of MyObject  out of START_ARRAY token
  at [Source: org.apache.http.conn.EofSensorInputStream@4076e940; line: 1, column: 1]
   at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:198)
   at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeUsingCreator(BeanDeserializer.java:565)
   at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:365)
   at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2395)
   at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1655)
   at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:135)
   at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154)
   at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:74)
   at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:632)
   at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:618)
   at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:459)
   ... 10 more

MyObject 구조는 서버 측 응용 프로그램과 동일합니다.

나는 다음과 같이 서버를 요청하려고 시도했다.

final String url = ".....";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Consultant> responseEntity = restTemplate.getForEntity(
            url, Consultant.class);

또는 다음과 같이하십시오.

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<MyObject> response = restTemplate
            .exchange("....",HttpMethod.GET, entity, MyObject.class);
System.out.println("RESPONSE: " + response.getBody());

하지만 여전히 위와 같은 오류. 나는이 시점에서 내가 무엇을 놓치고 있는지 알 수 없다. 어떤 생각이나 힌트가 좋을 것이다. 고맙습니다.

해결법

  1. ==============================

    1.유사한 상황의 해결책은 Consultant []에게 매핑하는 것이 었습니다. 매핑 된 객체의 JSON 배열을 비 직렬화하려는 경우에 적용됩니다.

    유사한 상황의 해결책은 Consultant []에게 매핑하는 것이 었습니다. 매핑 된 객체의 JSON 배열을 비 직렬화하려는 경우에 적용됩니다.

  2. ==============================

    2.Consultant.class 대신 List 에 매핑해야합니다.

    Consultant.class 대신 List 에 매핑해야합니다.

  3. ==============================

    3.이것은 Jackson과 어레이에서 컨테이너를 비 직렬화하고 초기화하려는 방식과 관련이 있습니다.

    이것은 Jackson과 어레이에서 컨테이너를 비 직렬화하고 초기화하려는 방식과 관련이 있습니다.

    내 사용 컨텍스트가 약간 다르긴하지만, 일부 사용자가 Jackson 특정 디시 리얼 라이 제이션 오류를 검색하는 데 도움이 될 수 있습니다.

    나는 이렇게해야만했다 :

    List<Consultant> consultants = Arrays.asList(
        mapper.readValue(myJson.toString(), Consultants[].class)
    );
    
  4. ==============================

    4.foo.json 파일에는 다음과 같은 데이터 배치가 들어 있습니다.

    foo.json 파일에는 다음과 같은 데이터 배치가 들어 있습니다.

    다음 문은 LinkedHashMap의 ArrayList를 제공합니다. 여기서 A B C D는 키입니다.

    List list = mapper.readValue(new File("D:\\...\\foo.json"), List.class);
    
  5. from https://stackoverflow.com/questions/10719729/cannot-deserialize-instance-of-object-out-of-start-array-token-in-spring-3-rest by cc-by-sa and MIT license