2016-09-07 3 views
1

私は春のフレームワークで4.3.1Spring 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; 
    } 

    .... 

を持っています。 私はあまりにも、次のしているJAXB2Jackson2

で働いています:

@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などPOSTPUTGETDELETEについては、それをCRUDシナリオをテストすることができます。したがって、私は1つの実体と実体の集合を得ることができます。

:前のノートから、XMLJSON形式の周りに働くすべての作品。

は今、プログラムのクライアントの種類は、それがのみコレクションのを失敗したか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) 
間違っている何

または欠落していますか?それはHttpMessageConverterExtractorParameterizedTypeReferenceが期待されているように、GenericHttpMessageConverterではありませんあなたはMarshallingHttpMessageConverterを使用

+0

ManuelさんはあなたのPOMを共有できますか?コンフィグレーション –

+0

私は 'Gradle'を使って作業しています。依存関係についての' Spring Framework'設定を共有しました。あなたが見たい特定のセクションを教えてください。 –

答えて

1

あなたの問題:

if (messageConverter instanceof GenericHttpMessageConverter) { 
       GenericHttpMessageConverter<?> genericMessageConverter = 
         (GenericHttpMessageConverter<?>) messageConverter; 
       if (genericMessageConverter.canRead(this.responseType, null, contentType)) { 

MappingJackson2HttpMessageConverterはその一つです。

だから、Jaxb2CollectionHttpMessageConverterを試してみることをおすすめします。

+0

興味深いことに、私は 'Jaxb2CollectionHttpMessageConverter'についての調査を行います。それは面白いです。 'Spock Framework'を使って' responseEntity = restTemplate.exchange(requestEntity、GenericCollection.class) 'という行を使って動作するコードとほぼ同じコード(他のプロジェクトの以前のバージョン)を持っています。残念ながら、その行はJavaでコンパイルされません –

関連する問題