no suitable HttpMessageConverter found for response type

前端 未结 10 1780
深忆病人
深忆病人 2020-11-30 02:33

Using spring, with this code :

List> messageConverters = restTemplate.getMessageConverters();
for(HttpMessageConverter ht         


        
10条回答
  •  生来不讨喜
    2020-11-30 02:54

    You can make up a class, RestTemplateXML, which extends RestTemplate. Then override doExecute(URI, HttpMethod, RequestCallback, ResponseExtractor), and explicitly get response-headers and set content-type to application/xml.

    Now Spring reads the headers and knows that it is `application/xml'. It is kind of a hack but it works.

    public class RestTemplateXML extends RestTemplate {
    
      @Override
      protected  T doExecute(URI url, HttpMethod method, RequestCallback requestCallback,
            ResponseExtractor responseExtractor) throws RestClientException {
    
         logger.info( RestTemplateXML.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 XML
            response.getHeaders().setContentType(MediaType.APPLICATION_XML);
    
            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 {
               logger.debug(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 {
         if (logger.isWarnEnabled()) {
            try {
               logger.warn(method.name() + " request for \"" + url + "\" resulted in " +
                     response.getRawStatusCode() + " (" + response.getStatusText() + "); invoking error handler");
            }
            catch (IOException e) {
               // ignore
            }
         }
         getErrorHandler().handleError(response);
      }
    }
    

提交回复
热议问题