【发布时间】:2016-09-07 17:17:28
【问题描述】:
我正在使用 Spring Framework 4.3.1
我有以下域类
@XmlRootElement(name="persona")
@XmlType(propOrder = {"id","nombre","apellido","fecha"})
public class Persona implements Serializable {
@XmlElement(name="id")
@JsonProperty("id")
public String getId() {
return id;
}
....
每个 getter 都有 @XmlElement 和 @JsonProperty 注释。
我正在使用 JAXB2 和 Jackson2
我也有以下:
@XmlRootElement(name="collection")
public class GenericCollection<T> {
private Collection<T> collection;
public GenericCollection(){
}
public GenericCollection(Collection<T> collection){
this.collection = collection;
}
@XmlElement(name="item")
@JsonProperty("collection")
public Collection<T> getCollection() {
return collection;
}
public void setCollection(Collection<T> collection) {
this.collection = collection;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
for(Object object : collection){
builder.append("[");
builder.append(object.toString());
builder.append("]");
}
return builder.toString();
}
}
关于测试,许多@Tests 方法通过Spring MVC Test 工作正常。 @Controller 和 @RestController 按预期工作。
注意:我可以测试 CRUD 场景,它与 HTTP methods 有关,例如 POST、PUT、GET 和 DELETE。因此,我能够获得一个实体和一组实体。
注意:从之前的说明来看,所有工作都围绕XML 和JSON 格式工作。
现在尝试通过RestTemplate 测试一种程序化客户端,它仅 失败 用于集合。带有以下内容:
@Before
public void setUp(){
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
restTemplate = new RestTemplate(new MockMvcClientHttpRequestFactory(mockMvc));
List<HttpMessageConverter<?>> converters = new ArrayList<>();
converters.add(httpMessageConverterConfig.marshallingMessageConverter());
converters.add(httpMessageConverterConfig.mappingJackson2HttpMessageConverter());
restTemplate.setMessageConverters(converters);
System.out.println("converters.size():" + converters.size());
}
我可以确认converters.size() 总是打印2
以下是针对 XML 和 JSON 的
@Test
public void findAllXmlTest(){
RequestEntity<Void> requestEntity = RestControllerSupport_.createRequestEntityForGet(uri, retrieveURI);
ParameterizedTypeReference<GenericCollection<Persona>> parameterizedTypeReference = new ParameterizedTypeReference<GenericCollection<Persona>>(){};
ResponseEntity<GenericCollection<Persona>> responseEntity = restTemplate.exchange(requestEntity, parameterizedTypeReference);
assertThat(responseEntity, notNullValue());
assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
assertThat(responseEntity.getHeaders().getContentType(), is(MediaType.APPLICATION_XML) );
assertThat(responseEntity.getBody(), notNullValue());
assertThat(responseEntity.getBody().getClass(), is(GenericCollection.class));
assertThat(responseEntity.getBody().getCollection(), is(personas));
}
@Test
public void findAllJsonTest(){
RequestEntity<Void> requestEntity = RestControllerSupport_.createRequestEntityForGet(uri, retrieveURI);
ParameterizedTypeReference<GenericCollection<Persona>> parameterizedTypeReference = new ParameterizedTypeReference<GenericCollection<Persona>>(){};
ResponseEntity<GenericCollection<Persona>> responseEntity = restTemplate.exchange(requestEntity, parameterizedTypeReference);
assertThat(responseEntity, notNullValue());
assertThat(responseEntity.getStatusCode(), is(HttpStatus.OK));
assertThat(responseEntity.getHeaders().getContentType(), is(MediaType.APPLICATION_JSON_UTF8) );
assertThat(responseEntity.getBody(), notNullValue());
assertThat(responseEntity.getBody().getClass(), is(GenericCollection.class));
assertThat(responseEntity.getBody().getCollection(), is(personas));
}
注意:注意我在这两种情况下都使用ParameterizedTypeReference。
对于 JSON,它可以工作。
但对于 XML,我得到:
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [com.manuel.jordan.controller.support.GenericCollection<com.manuel.jordan.domain.Persona>] and content type [application/xml]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)
出了什么问题或遗漏了什么?
【问题讨论】:
-
Manuel 你能分享你的 pom 吗?和配置
-
我正在使用
Gradle,刚刚分享了关于依赖项的Spring Framework配置。让我知道您想查看哪个特定部分。
标签: spring spring-mvc spring-test-mvc