/ / RestTemplate getForObject z Nie można odczytać JSON: Nieoczekiwany znak ('<' (kod 60)) - sprężyna, resttemplate

RestTemplate getForObject z nie można odczytać JSON: nieoczekiwany znak ("<" (kod 60)) - wiosna, resttemplate

Chcę odczytać ciąg z odpowiedzi http, tak jak to. Próbuję to zrobić [patrz poniżej], a to rzuca błąd.

1. klient

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

2. serwer

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

Plik konfiguracyjny 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>

Wyjątek

    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]

Organ odpowiedzi

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

Odpowiedzi:

2 dla odpowiedzi № 1

Usługa, do której ponownie uzyskujesz dostęp, zwraca odpowiedź XML, a nie odpowiedź JSON. To, co prawdopodobnie powinieneś zrobić, to użyć JAX-B do przekonwertowania tego XML na prawdziwy obiekt Java.

Z ta wtyczka zaćmienia możesz wygenerować już opisaną klasę Javaz twojego dokumentu xml. Następnie możesz użyć tej klasy w restTemplate (nie wymaga żadnej specjalnej sprężynowej konfiguracji xml) jako klasy, w której chcesz zdekrializować xml.

Lubię to:

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

Upewnić się Response to klasa z adnotacjami.

Jeśli chcesz tylko napisu, upewnij się, że wiosna nie próbuje deserializować go za pomocą konwertera komunikatów json.