我打算使用
Spring Rest Template发布XML消息.经过多次失败后,我开始怀疑Spring Rest Template是否可以POST一条XML消息.这是我开发的Restful客户端. RestTemplate旨在将一个XML的HTTP帖子发送到RestFul Web服务:
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"; } }
我在使用带RestTemplate的XML时发现的大部分示例都涉及使用对象映射工具.此工具将对象映射到XML,反之亦然.就我而言,我只有一个XML字符串,我想通过HTTP post发送.有没有人完成我想做的事情?可能是RestFul客户端不适合我想要做的事情.任何答案将不胜感激:)
编辑
XML消息是通过使用Xstream序列化Map生成的.这是执行此操作的代码:
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 – 写[
1
1
3
]使用[org.springframework.http.converter.StringHttpMessageConverter@1d34263a]
看起来restTemplate正在发布XML消息.但是,控制器中的anXML参数为null.这是否意味着XML消息无法到达控制器?可能是控制器没有正确实现?