6

我打算使用 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 消息无法到达控制器?可能是控制器没有正确实现吗?

4

1 回答 1

2

您不需要使用 Spring 的 JAXB 编组消息转换器 - 您已经通过将其转换为String. 只需发布String(就像在您的代码中一样)应该可以工作(String.class尽管丢失了用于 URL 变量的参数,并摆脱了setMessageConverters调用,因为这会阻止默认值StringHttpMessageConverter起作用)。

于 2013-03-11T11:04:39.283 回答