我打算使用 Spring Rest 模板发布 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";
}
}
我在使用 XML 和 RestTemplate 时发现的大多数示例都涉及使用对象映射工具。此工具将对象映射到 XML,反之亦然。在我的例子中,我只有一个我想通过 HTTP post 发送的 XML 字符串。有没有人完成我想做的事情?这可能是 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 的转换器将多图转换为 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 的建议更改了我的代码。我在日志文件中看到了这一点:
调试:org.springframework.web.client.RestTemplate - 使用 [org.springframework.http.converter.StringHttpMessageConverter@1d34263a] 编写 [1 1 3]
看起来 restTemplate 正在发布 XML 消息。但是,控制器中的 anXML 参数为空。这是否意味着 XML 消息无法到达控制器?可能是控制器没有正确实现吗?