3

このように、http応答から文字列を読み取りたい。これを実行しようとしています [以下を参照]、エラーが発生しています。

1.クライアント

String string=getForObject("http://127.0.0.1:6060/dc-server/rest/dataset/Book/meta", String.class);

2.サーバー

@ResponseBody
@RequestMapping(value="/dataset/{datasetName}/meta", method=RequestMethod.GET)
public String getDatasetMeta(@PathVariable("datasetName") String datasetName) {
    return service.getDatasetMeta(datasetName);
}

spring mvc 構成ファイル

<bean id="jsonMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
</bean>
<bean id="stringHttpMessageConverter"  class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <list>
            <ref bean="jsonMessageConverter" />
            <ref bean="stringHttpMessageConverter"/>
        </list>
    </property>
</bean>

例外

    org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@19a6fa1; line: 1, column: 2]; nested exception is org.codehaus.jackson.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@19a6fa1; line: 1, column: 2]
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:127)
    at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:153)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:81)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:446)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401)
    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:199)
    at com.cgs.dc.client.rest.RestConnector.getDatasetMeta(RestConnector.java:55)
    at server/rest/dataset/Book/meta" resulted in 200 (OK)
14:01:05,395 DEBUG RestTemplate:78 - Reading [java.lang.String] as "application/json" using [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter@1371ddd]

レスポンスボディ

<dataset xmlns="http://sucsoft.com/DC_DEF" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ......
4

1 に答える 1

3

アクセスしているサービスは、json 応答ではなく、xml 応答を返しています。おそらくすべきことは、JAX-B を使用してその xml を実際の Java オブジェクトに変換することです。

このEclipse プラグインを使用すると、xml ドキュメントから既に注釈が付けられた Java クラスを生成できます。次に、xml を逆シリアル化するクラスとして、restTemplate でそのクラスを使用できます (特別な spring xml 構成は必要ありません)。

このような:

Response response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(null), Response.class);

Responseが注釈付きクラスであることを確認してください。

文字列だけが必要な場合は、Spring が json メッセージ コンバーターを使用してそれを逆シリアル化しようとしていないことを確認してください。

于 2013-06-20T08:04:57.823 に答える