2013-03-11 475 views
6

我打算使用Spring Rest模板發佈XML消息。經過多次失敗之後,我開始懷疑Spring Rest Template是否可以發佈XML消息。這是我開發的一個Restful客戶端。所述RestTemplate意圖做一個XML的HTTP post操作一個RESTful web服務:如何使用RestTemplate POST POST XML

Class RestClient{ 
    public static void main(String[] args) { 

RestTemplate restTemplate = new RestTemplate(); 


    List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 

    //This JAXB Message converter is intended to marshal an XML message over HTTP. 
    //However, I find this converter is not doing the intended function. 

    Jaxb2RootElementHttpMessageConverter jaxbMessageConverter = new Jaxb2RootElementHttpMessageConverter(); 
    List<MediaType> mediaTypes = new ArrayList<MediaType>(); 
    mediaTypes.add(MediaType.TEXT_HTML); 
    jaxbMessageConverter.setSupportedMediaTypes(mediaTypes); 
messageConverters.add(jaxbMessageConverter); 
restTemplate.setMessageConverters(messageConverters); 
restTemplate.postForLocation("http://localhost:8080/RecipeProject/restCallConsumer", "<add><somefield></somefield></add>",String.class); 
    } 

}

該控制器旨在消耗XML消息。該控制器被寫入測試該客戶端可以適當地發送XML消息:

@RequestMapping("/") 
@Controller 
public class HomeController { 
@RequestMapping(value = "/restCallConsumer", method = RequestMethod.POST) 
public String restCallConsumer(String anXML) { 
System.out.println("anXML: " + anXML); 
return "aView"; 
} 
} 

大多數我發現周圍使用XML與RestTemplate例子的涉及使用的對象映射工具。該工具將對象映射到XML,反之亦然。在我的情況下,我只有一個我想通過HTTP發送的XML字符串。有沒有人完成我想要做的事情?這可能是RestFul客戶端不是爲我想要做的。任何答案,將不勝感激:)

EDIT

XML消息是通過採用序列西河一個地圖生成。這是這樣的代碼:

com.google.common.collect.LinkedListMultimap.ListMultimap<String, String> multimap = com.google.common.collect.LinkedListMultimap.LinkedListMultimap.create(); 
multimap.put("x", "1"); 
multimap.put("x", "2"); 
multimap.put("y", "3"); 

XStream xStream = new XStream(new DomDriver()); 
xStream.registerConverter(new MapEntryConverter(xStream.getMapper())); 

xStream.alias("add", multimap.getClass()); 
String xml = xStream.toXML(multimap); 
System.out.println(xml); 

此代碼旨在使用名爲MapEntryConverter的轉換器將multimap轉換爲XML字符串。這是轉換器的代碼:

public static class MapEntryConverter extends MapConverter { 

public MapEntryConverter(Mapper mapper) { 
    super(mapper); 
} 

public boolean canConvert(Class clazz) { 
    return ListMultimap.class.isAssignableFrom(clazz); 
} 

public void marshal(Object value, HierarchicalStreamWriter writer, 
    MarshallingContext context) { 

    ListMultimap<String, String> map = (ListMultimap<String, String>) value; 
    for (String key : map.keys()) { 
    writer.startNode(key); 
    writer.setValue(map.get(key).get(0)); 
    writer.endNode(); 
    } 
} 

} 

編輯

我改變我的代碼,按照建議的@artbristol。我看到這個日誌文件:

DEBUG:org.springframework.web.client.RestTemplate - 寫[]使用[[email protected]34263a]

它看起來像restTemplate正在張貼XML消息。但是,控制器中的anXML參數爲空。這是否意味着XML消息無法到達控制器?難道控制器沒有正確實施?

+0

我可以知道你爲什麼期待它在一個XMLMessage字段下嗎?嘗試http://stackoverflow.com/questions/4118670/sending-multipart-file-as-post-parameters-with-resttemplate-requests – Rudy 2013-03-11 07:36:20

+0

@Rudy XML消息本身將通過使用XStream序列化一個Map生成。我會將這些信息添加到我的問題中。感謝您的鏈接:) – zfranciscus 2013-03-11 08:48:44

回答

2

您不需要使用Spring的JAXB編組消息轉換器 - 您已經通過將其轉換爲String來完成工作。只需發佈String(就像在你的代碼中一樣)應該可以工作(儘管它丟失了String.class的參數,這是針對URL變量的,並且擺脫了setMessageConverters調用,因爲這阻止了默認的StringHttpMessageConverter的工作)。

+0

它看起來像它的作品:)但是,我無法打印出控制器中的XML消息。 XML消息爲空。我在我的問題中添加了更多信息。謝謝@artbristol – zfranciscus 2013-03-11 11:31:28

+0

我注意到'StringHttpMessageConverter'默認添加HTTP頭文件'Content-Type:text/plain'而不是你想要的'text/html' - 正確配置(以你配置Jaxb2RootElementHttpMessageConverter的方式)在你的問題)可能會修復它 – artbristol 2013-03-11 11:51:07

+0

@artbristol我也有類似的問題[這裏](http://stackoverflow.com/questions/27758462/how-to-post-xml-data-through-resttemplate-in-the-body請求)在'RestTemplate'上。如果可能的話,你能幫我一把嗎?我陷入了一段時間,不能理解如何使其工作。任何幫助將不勝感激。 – john 2015-01-04 12:14:15