簡體   English   中英

使用Spring Boot TestRestTemplate相對路徑強制JSON轉換

[英]Using Spring Boot TestRestTemplate relative path forces JSON conversion

根據Spring Boot 文檔

注意,無論何時使用@SpringBootTestTestRestTemplate現在都可以作為bean使用。 它已預先配置為解析到http://localhost:${local.server.port}相對路徑。 我們還可以使用@LocalServerPort批注將服務器正在運行的實際端口注入到測試字段中。

我有一個返回XML數據的RESTFul應用程序。 POM文件包含jackson-dataformat-xml在測試類中,我具有以下代碼:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class XMLDataTest {

    @Autowired
    private TestRestTemplate restTemplate;
    ...
    ResponseEntity<List<City>> cities = restTemplate.exchange(appPath,
        HttpMethod.GET, null, paramType);

    assertThat(cities.getBody()).hasSize(8);
    assertThat(cities.getBody()).contains(this.c1, this.c2, this.c3);

如果appPath等於完整的URL,例如http://localhost:9234/myapp/cities ,則測試運行正常。 如果appPath等於相對路徑/myapp/citiesappPath收到JSON異常。 看起來相對路徑強制進行JSON轉換。

例外:

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
 at [Source: java.io.PushbackInputStream@4628a02b; line: 1, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
    at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1234)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1122)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1075)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:338)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:269)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:259)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2938)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:235)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:223)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:96)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:924)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:908)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:662)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:620)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:566)
    at org.springframework.boot.test.web.client.TestRestTemplate.exchange(TestRestTemplate.java:812)
    at com.zetcode.test.RestControllerTest.allCitiesTest(RestControllerTest.java:51)

如何解決這個問題?

該API返回JSON對象,並且您需要一個JSON數組,因此是異常。 為了使其返回XML,您需要指定請求的Accept標頭。

有用的技巧:調試此類問題時,請使用String.class作為預期的響應類型,並打印結果。

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);

HttpEntity<String> entity = new HttpEntity<>("parameters", headers);

ResponseEntity<List<City>> cities = restTemplate.exchange(appPath,
           HttpMethod.GET, entity, paramType);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM