我打算使用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消息無法到達控制器?難道控制器沒有正確實施?
我可以知道你爲什麼期待它在一個XMLMessage字段下嗎?嘗試http://stackoverflow.com/questions/4118670/sending-multipart-file-as-post-parameters-with-resttemplate-requests – Rudy 2013-03-11 07:36:20
@Rudy XML消息本身將通過使用XStream序列化一個Map生成。我會將這些信息添加到我的問題中。感謝您的鏈接:) – zfranciscus 2013-03-11 08:48:44