私は春のフレームワークで4.3.1
Spring MVCのテスト:ジェネリックコレクションが(でもParameterizedTypeReferenceで)失敗し
を働いている私は、次のドメインクラスの各ゲッターが@XmlElement
と@JsonProperty
注釈を持って
@XmlRootElement(name="persona")
@XmlType(propOrder = {"id","nombre","apellido","fecha"})
public class Persona implements Serializable {
@XmlElement(name="id")
@JsonProperty("id")
public String getId() {
return id;
}
....
を持っています。 私はあまりにも、次のしている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();
}
}
テスト、Spring MVC Test
作業罰金を通じて作業の多く@Test
の方法について。 @Controller
との動作が期待されます。
注:私はHTTP methods
などPOST
、PUT
、GET
とDELETE
については、それをCRUDシナリオをテストすることができます。したがって、私は1つの実体と実体の集合を得ることができます。
注:前のノートから、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)
間違っている何
または欠落していますか?それはHttpMessageConverterExtractor
にParameterizedTypeReference
が期待されているように、GenericHttpMessageConverter
ではありませんあなたはMarshallingHttpMessageConverter
を使用
ManuelさんはあなたのPOMを共有できますか?コンフィグレーション –
私は 'Gradle'を使って作業しています。依存関係についての' Spring Framework'設定を共有しました。あなたが見たい特定のセクションを教えてください。 –