【问题标题】:Spring for Android - Could not extract response: no suitable HttpMessageConverter found for response typeSpring for Android - 无法提取响应:没有找到适合响应类型的 HttpMessageConverter
【发布时间】:2014-09-28 06:40:51
【问题描述】:

我正在尝试使用 Spring for Android 从 REST 服务中检索一些数据。 但是我遇到了问题。我也在使用 Robospice - 因此有这样的方法:

 public FunkyThingsList loadDataFromNetwork() throws Exception {
        String baseURI =context.getResources().getString(R.string.baseWebServiceURI);
                String uri = baseURI + "/FunkyThings/date/" + dateToLookUp.toString("yyyy-MM-dd");
        RestTemplate restTemplate = getRestTemplate();
        final HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        headers.setAccept( Arrays.asList(MediaType.APPLICATION_JSON));
        HttpAuthentication authHeader = new HttpBasicAuthentication(username, password);
        headers.setAuthorization(authHeader);

        // Create the request body as a MultiValueMap
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        HttpMessageConverter<String> stringConverter = new StringHttpMessageConverter();
        FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
        List<HttpMessageConverter<?>> msgConverters = restTemplate.getMessageConverters();
        msgConverters.add(formConverter);
        msgConverters.add(stringConverter);
        restTemplate.setMessageConverters(msgConverters);

        HttpEntity<?> httpEntity = new HttpEntity<Object>(map, headers);
        final ResponseEntity<FunkyThingsList> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity,FunkyThingsList.class);

        return responseEntity.getBody();
    }

很遗憾,这不起作用。我收到以下异常:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [com.MyProject.DataClassPojos.RoboSpiceArrayLists.FunkyThingsList] and content type [application/json;charset=utf-8]

现在根据我的谷歌搜索,我觉得我需要添加一个消息转换器。我只是不确定我需要哪个消息转换器,或者我在哪里添加它?

【问题讨论】:

    标签: java android spring robospice spring-android


    【解决方案1】:

    对于默认 JSON HttpMessageConverter,您需要将 Jackson 1 或 Jackson 2 添加到您的类路径中。

    否则,您可以添加一些其他 JSON 库并编写自己的 HttpMessageConverter 来进行反序列化。您将其添加到RestTemplate。您可以使用构造函数或this method

    【讨论】:

    • 我已将其更改为 msgConverters.add(formConverter); msgConverters.add(stringConverter); msgConverters.add(新的 MappingJacksonHttpMessageConverter()); restTemplate.setMessageConverters(msgConverters);但仍然得到相同的响应:/
    • 正确,需要将Jackson添加到你的类路径中,然后添加对应的MappingJackson2HttpMessageConverter。或者,您可以将 Gson 与 GsonHttpMessageConverter 一起使用。两个消息转换器都处理 application/json 媒体类型。关键是必须将 Jackson 或 Gson 作为依赖项包含在您的项目中。
    • 我正在使用 Gradle:编译 'org.codehaus.jackson:jackson-mapper-asl:1.9.13' 然后在我的 java 文件中导入:import org.springframework.http.converter.json。映射JacksonHttpMessageConverter;所以我认为这是我的类路径覆盖?
    • @ChrisNevill 有一个编译时类路径和一个运行时类路径。如果您的应用程序因ClassNotFoundException 而失败,则您的类路径缺少该类。是吗?
    • @SotiriosDelimanolis 不幸的是,这不太正确。 Spring for Android RestTemplate 默认不注册任何消息转换器。克里斯,你需要添加 msgConverters.add(jacksonMessageConverter);
    【解决方案2】:

    如果您遵循 Spring for Android 教程并遇到同样的错误 - 这可能会有所帮助:

    在您的 MainActivity.java 中:

    ...
    RestTemplate restTemplate = new RestTemplate();
    MappingJacksonHttpMessageConverter converter = new
    MappingJacksonHttpMessageConverter();    
    converter.setSupportedMediaTypes(Collections.singletonList(MediaType.TEXT_HTML));
    restTemplate.getMessageConverters().add(converter);
    

    在调用中使用转换器并将其配置为使用 TEXT_HTML 的媒体类型,然后使用转换器的实例。

    此外,该教程有点过时,因此请在 build.gradle 中使用最新版本作为 suggested here

    dependencies{
     //Spring Framework for REST calls and Jackson for JSON processing
     compile 'org.springframework.android:spring-android-rest-template:2.0.0.M3'
    
     compile 'com.fasterxml.jackson.core:jackson-databind:2.4.1.3'
    }
    repositories {
     maven {
        url 'https://repo.spring.io/libs-milestone'
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 2014-09-03
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2020-02-12
      • 2014-03-18
      • 2021-11-18
      • 2019-09-09
      相关资源
      最近更新 更多