2

好的,我回来寻找解决方案。

我正在尝试使用 Spring RestTemplatepostForEntity方法发送实例集合。当尝试spring给出错误org.springframework.http.converter.HttpMessageNotWritableException: Could not write request: no suitable HttpMessageConverter found for request type [com.abc.base.domai n.dto.gift.GiftItemListAppriciate时,如果有人可以告诉我如何使用spring resttemplate POST方法发送一个ArrayList。

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>

我试图发布的实例,

 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 实例包装类

    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) {

}
4

1 回答 1

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"}}

要填充您的类属性,它们必须是这样的:

人.java

public class person {

 private Data data;

 public Data getData() {
 return data;
 }

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

数据.java

public class Data {

 private String ticket;

 public String getTicket() {
   return ticket;
 }

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

}

最后在您的应用程序中添加:

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

requestEntity 是一个包含您的请求正文的字符串(在我的例子中是 JSON)。

希望有帮助!

于 2014-03-26T11:09:12.437 回答