0

首先我不得不说,我对 Springs RestTemplate 还是很陌生。

我正在尝试从imdb-api接收数据。(例如http://imdbapi.org/?title=Avatar&type=xml)因此我使用 Springs RestTemplate。但:

  1. Web服务将数据作为应用程序/八位字节流返回(即使我声明我想要它作为xml(当我用浏览器浏览网站时,我得到的数据是text/xml))
  2. RestTemplate 没有找到我声明的 ByteArrayMessageConverter(转换应用程序/八位字节流)

我真的不知道我的错误在哪里。

这是初始化restTemplate的代码:

public void onInit() {
    _log.debug("Setting up the Spring Resttemplate");

    _restTemplate = new RestTemplate();
    List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
    list.add(new SourceHttpMessageConverter<Source>());
    list.add(new ByteArrayHttpMessageConverter());
    _restTemplate.setMessageConverters(list);

    _log.debug("Setting up the HTTP Headers for Restrequest");
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
    _log.trace("allow {}", MediaType.APPLICATION_XML_VALUE);
    acceptableMediaTypes.add(MediaType.APPLICATION_XML);
    _log.trace("allow {}", MediaType.TEXT_HTML_VALUE);
    acceptableMediaTypes.add(MediaType.TEXT_XML);
    _log.trace("set accepted charset to uft-8");
    List<Charset> acceptableCharsets = new ArrayList<Charset>();
    acceptableCharsets.add(Charset.forName("utf-8"));

    _httpHeaders = new HttpHeaders();
    _httpHeaders.set("User-Agent", "something"); //only a user-agent, because the api returns a 403 if it is not set
    _httpHeaders.setAcceptCharset(acceptableCharsets);
    _httpHeaders.setAccept(acceptableMediaTypes);
}

这是调用的代码:

_log.info("connect to Imdb-Webservice {}", _imbdWebserviceBaseUrl);

    Map<String, Object> uriVariables = new HashMap<String, Object>();
    uriVariables.put("title", pTitle);

    ResponseEntity<Source> response = _restTemplate.exchange(_imbdWebserviceBaseUrl, HttpMethod.GET, new HttpEntity<String>(_httpHeaders), Source.class, uriVariables);

_imbdWebserviceBaseUrl 设置为http://imdbapi.org/?title= {title}&type=xml

然后我收到此错误消息:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [interface javax.xml.transform.Source] and content type [application/octet-stream]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:107)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:687)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:673)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:491)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:454)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:401)
at my.domain.projectname.integrationimpl.WebserviceHelper.getXml(WebserviceHelper.java:131)

谢谢你的帮助

4

1 回答 1

2

Web 服务将数据作为 application/octet-stream 返回(即使我声明我希望它为 xml(当我用浏览器浏览网站时,我将数据作为 text/xml 获取))

据我所知,这个休息服务没有返回正确的内容类型(文本/xml或类似)。如果您的浏览器正确呈现它,那可能是 Chrome 或 Firefox,但 IE 只会向您显示 html-ish 类型的输出。

RestTemplate找不到我声明ByteArrayMessageConverter的(转换应用程序/八位字节流)

好吧,据我所知,您正在要求一个来源:

ResponseEntity<Source> response = _restTemplate.exchange(_imbdWebserviceBaseUrl, HttpMethod.GET, new HttpEntity<String>(_httpHeaders), Source.class, uriVariables);

MessageConverters 本身有一种方法可以确定此转换器是否适用,因为它ByteArrayHttpMessageConverter是:

@Override
public boolean supports(Class<?> clazz) {
    return byte[].class.equals(clazz);
}

由于您要求 Source.class 它不会使用此转换器。

于 2013-02-28T15:23:13.440 回答