2013-04-03 3 views
2

Ok здесь iam назад, чтобы найти решение.RestTemplate POST a Collection

Iam try Spring RestTemplate postForEntity метод отправки коллекции экземпляров. При попытке пружины возникает ошибка org.springframework.http.converter.HttpMessageNotWritableException: Could not write request: no suitable HttpMessageConverter found for request type [com.abc.base.domai n.dto.gift.GiftItemList Аппликация, если кто-то может сообщить мне, как отправить ArrayList с помощью метода POST с пружинным resttemplate.

RestTemplate боб:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <constructor-arg ref="httpClientFactory"/> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
      <bean id="jsonViewResolver" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" > 
       <property name="objectMapper"> 
        <ref bean="JacksonObjectMapper" /> 
       </property>    
       <property name="supportedMediaTypes"> 
          <list> 
          <bean class="org.springframework.http.MediaType"> 
           <constructor-arg value="application" /> 
           <constructor-arg value="json" /> 
           <constructor-arg value="#{T(java.nio.charset.Charset).forName('UTF-8')}"/> 
          </bean> 
          </list> 
       </property> 
      </bean>            
     </list> 
    </property> 
</bean> 
<bean id="JacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" /> 

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient"> 
    <constructor-arg ref="httpClientParams"/> 
</bean> 

<bean id="httpClientParams" class="org.apache.commons.httpclient.params.HttpClientParams">   
    <property name="connectionManagerClass" value="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"/> 
</bean> 

<bean id="httpClientFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory"> 
    <constructor-arg ref="httpClient"/> 
</bean> 

Instance, что IAM выкладываете,

public class GiftItem implements Entity, Serializable {  

    private static final long serialVersionUID = 1L; 

    private String redeemLocation; 
    private String itemName;  
    private String itemDescription; 
    private String merchantName;  
    private Integer quantity; 
    private Integer imageId; 


    public GiftItem() { 
     super();   
    } 

    //with getters and setters 

} 

GiftItem экземпляр wraaper класса

public class GiftItemList implements Serializable { 

    private static final long serialVersionUID = -8202204714984099030L; 

    public GiftItemList() { 

    } 

    private List<GiftItem> giftItemList; 

    public List<GiftItem> getGiftItemList() { 
     return giftItemList; 
    } 

    public void setGiftItemList(List<GiftItem> giftItemList) { 
     this.giftItemList = giftItemList; 
    } 
} 

это, как я использую его,

public BaseResponse sendGiftEmail(final String token, final User sender,final String message, final GiftItemList giftItemList) { 

    MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>(); 
    map.add("token", token);   
    map.add("sender", sender); 
    map.add("message", message); 
    map.add("giftItemList", giftItemList); 
    return getRestTemplate().postForEntity(
      "http://localhost:8080/notification/api/notification/send_gift_email", 
    map, BaseResponse.class).getBody(); 
} 

и ошибка, я получаю,

org.springframework.http.converter.HttpMessageNotWritableException: Could not write request: no suitable HttpMessageConverter found for request type [com.abc.base.domain.dto.gift.GiftItemList] 
    at org.springframework.http.converter.FormHttpMessageConverter.write Part(FormHttpMessageConverter.java:310) 
    at org.springframework.http.converter.FormHttpMessageConverter.write Parts(FormHttpMessageConverter.java:270) 
    at org.springframework.http.converter.FormHttpMessageConverter.write Multipart(FormHttpMessageConverter.java:260) 
    at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:200) 
    at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:1) 
    at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:588) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:436) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401) 
    at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:302) 
    at com.tapgift.gift.client.impl.GiftClientImpl.sendGiftNotifications(GiftClientImpl.java:101) 

ПОМ:

<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.2</version> 
    </dependency> 

почти забыл приемник контроллера

@RequestMapping(value = "/notification/send_gift_email", method = RequestMethod.POST) 
    public @ResponseBody BaseResponse sendGiftEmail(@RequestParam("token") String token,  @RequestParam("sender")final User sender, @RequestParam("message")final String message,@RequestParam("giftItemList") GiftItemList giftItemList) { 

} 

ответ

0

Вы должны добавить MappingJacksonHttpMessageConveter к вашему messageCoverter:

List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 
messageConverters.add(new FormHttpMessageConverter()); 
messageConverters.add(new StringHttpMessageConverter()); 
messageConverters.add(new MappingJacksonHttpMessageConverter()); 
restTemplate = new RestTemplate(); 

restTemplate.setMessageConverters(messageConverters); 

Кроме того, необходимо добавить зависимость для:

jackson-core-asl-x.x.x.jar & jaackson.mapper.asl-x.x.x.jar 

Другое дело, вы должны убедиться, что ваш класс имеет тот же атрибут, как ваши свойства JSON. Например:

{"data":{"ticket":"TICKET_870299cf98e227abdbd5f9b7064390c5723a0c6a"}} 

Чтобы заполнить свои свойства класса, они должны быть такими:

person.java

public class person { 

private Data data; 

public Data getData() { 
return data; 
} 

public void setData(Data data) { 
    this.data = data; 
} 
} 

data.java

public class Data { 

private String ticket; 

public String getTicket() { 
    return ticket; 
} 

public void setTicket(String ticket) { 
    this.ticket = ticket; 
} 

} 

Finaly в вашем заявление добавить:

person entity = restTemplate.postForObject(url, requestEntity, 
    person.class); 

requestEntity - это строка, содержащая тело запроса (JSON в моем случае).

Надеюсь, что помогло!

Смежные вопросы