2015-09-16 2 views
2

Во-первых, извините за возможный дубликат. Я нашел несколько вопросов относительно подобных проблем. Тем не менее, я до сих пор не могу понять, что случилось в моем конкретном случае.Не подходит HttpMessageConverter, найденный для типа ответа - Пользовательский RestTemplate

Так, например, JSON от сервера:

[ 
    { 
    "_id": "55f9690f30ef6f210e2dc3a5", 
    "ID": "74c4bf82-9f78-4df5-b9d7-6547e2a55eaa", 
    "Name": "myLand, Saarbrücken", 
    "__v": 0, 
    "Shops": [ 
     { 
     "ID": "b8eacee1-b2c6-48aa-ac6f-2e7fbe3a5d68", 
     "Name": "ARA", 
     "_id": "55f9690f30ef6f210e2dc3a6", 
     "News": [ 
      { 
      "ID": "d79b7f51-7d5c-4bd6-9321-e40c6e93788c", 
      "ValidFrom": "2015-01-08T00:00:00", 
      "ValidTo": "2015-09-30T00:00:00", 
      "_id": "55f9690f30ef6f210e2dc3a7", 
      "Texts": [ 
       { 
       "ID": "TITLE", 
       "Value": "11. Wochenspiegel Firmenlauf", 
       "_id": "55f9690f30ef6f210e2dc3a9" 
       }, 
       { 
       "ID": "BODY", 
       "Value": "Wir gratulieren zur ersten und gleich sehr erfolgreichen Teilnahme am 11.Wochenspiegel Firmenlauf in Dillingen,\r\nunsere Teams vom “Outlet center Wadgassen“ haben ihren Lauf mit tollen Zeiten abgeschlossen und hatten trotz\r\nhohen Temperaturen einen wunderbaren Tag – wie man sehen kann. Wir freuen uns schon jetzt auf nächstes Jahr!", 
       "_id": "55f9690f30ef6f210e2dc3a8" 
       } 
      ] 
      } 
     ], 
     "Texts": [ 
      { 
      "ID": "DESCRIPTION", 
      "Value": "Mit Tradition in die Zukunft Seit sechs Jahrzehnten steht ara für vielfältige Schuhmode erstklassiger Qualität,", 
      "_id": "55f9690f30ef6f210e2dc3aa" 
      } 
     ] 
     } 
    ] 
    } 
] 

Я создал класс под названием Mall (и все подклассы для остальной части структуры данных):

public class Mall 
{ 

    private String Id; 
    private String ID; 
    private String Name; 
    private int V; 
    private List<Shop> Shops = new ArrayList<Shop>(); 
    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

    /** 
    * @return The Id 
    */ 
    public String getId() 
    { 
     return Id; 
    } 

    /** 
    * @param Id The _id 
    */ 
    public void setId(String Id) 
    { 
     this.Id = Id; 
    } 

    /** 
    * @return The ID 
    */ 
    public String getID() 
    { 
     return ID; 
    } 

    /** 
    * @param ID The ID 
    */ 
    public void setID(String ID) 
    { 
     this.ID = ID; 
    } 

    /** 
    * @return The Name 
    */ 
    public String getName() 
    { 
     return Name; 
    } 

    /** 
    * @param Name The Name 
    */ 
    public void setName(String Name) 
    { 
     this.Name = Name; 
    } 

    /** 
    * @return The V 
    */ 
    public int getV() 
    { 
     return V; 
    } 

    /** 
    * @param V The __v 
    */ 
    public void setV(int V) 
    { 
     this.V = V; 
    } 

    /** 
    * @return The Shops 
    */ 
    public List<Shop> getShops() 
    { 
     return Shops; 
    } 

    /** 
    * @param Shops The Shops 
    */ 
    public void setShops(List<Shop> Shops) 
    { 
     this.Shops = Shops; 
    } 

    public Map<String, Object> getAdditionalProperties() 
    { 
     return this.additionalProperties; 
    } 

    public void setAdditionalProperty(String name, Object value) 
    { 
     this.additionalProperties.put(name, value); 
    } 

} 

Сервер возвращает conent типа текст/обычный , Для того, чтобы изменить тип содержимого, я написал простой расширить класс:

public class RestTemplateJSON extends RestTemplate 
{ 

    @Override 
    protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback, 
           ResponseExtractor<T> responseExtractor) throws RestClientException 
    { 

     //logger.info(RestTemplateJSON.class.getSuperclass().getSimpleName() + ".doExecute() is overridden"); 

     Assert.notNull(url, "'url' must not be null"); 
     Assert.notNull(method, "'method' must not be null"); 
     ClientHttpResponse response = null; 
     try 
     { 
      ClientHttpRequest request = createRequest(url, method); 
      if (requestCallback != null) 
      { 
       requestCallback.doWithRequest(request); 
      } 
      response = request.execute(); 

      // Set ContentType to JSON 
      response.getHeaders().setContentType(MediaType.APPLICATION_JSON); 

      if (!getErrorHandler().hasError(response)) 
      { 
       logResponseStatus(method, url, response); 
      } else 
      { 
       handleResponseError(method, url, response); 
      } 
      if (responseExtractor != null) 
      { 
       return responseExtractor.extractData(response); 
      } else 
      { 
       return null; 
      } 
     } 
     catch (IOException ex) 
     { 
      throw new ResourceAccessException("I/O error on " + method.name() + 
        " request for \"" + url + "\":" + ex.getMessage(), ex); 
     } 
     finally 
     { 
      if (response != null) 
      { 
       response.close(); 
      } 
     } 

    } 

    private void logResponseStatus(HttpMethod method, URI url, ClientHttpResponse response) 
    { 
     //if (logger.isDebugEnabled()) 
     { 
      try 
      { 
       System.out.println(method.name() + " request for \"" + url + "\" resulted in " + 
         response.getRawStatusCode() + " (" + response.getStatusText() + ")"); 
      } 
      catch (IOException e) 
      { 
       // ignore 
      } 
     } 
    } 

    private void handleResponseError(HttpMethod method, URI url, ClientHttpResponse response) throws IOException 
    { 
     getErrorHandler().handleError(response); 
    } 
} 

Наконец, это то, как я пытаюсь потреблять мой WebService:

RestTemplateJSON restTemplate = new RestTemplateJSON(); 
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
Mall mall = restTemplate.getForObject(url, Mall.class); 

Однако, я все еще получаю такое же исключение:

не удалось извлечь ответ: нет подходящего HttpMessageConverter не найдено для типа отклика [mmrestspringtest.Mall.Mall] и тип контента [приложения/JSON]

Насколько я знаю, если я изменяю тип контента, все должно быть в порядке. Не могли бы вы рассказать мне, что я делаю неправильно?

ответ

3

Итак, я, наконец, понял это. В json есть массив, поэтому я хочу сопоставить его с Mall [], а не Mall. Я предусмотрел неправильный класс, должен быть:

RestTemplateJSON restTemplate = new RestTemplateJSON(); 
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
Mall[] malls = restTemplate.getForObject(url, Mall[].class); 
Смежные вопросы