Ich beabsichtige, eine XML-Nachricht mit Spring übrigen Vorlage zu erstellen. Nach einer Reihe von Fehlern beginne ich zu bezweifeln, ob Spring Rest Template eine XML-Nachricht senden kann. Dies ist ein Restful Client, den ich entwickelt habe. Die RestTemplate soll eine HTTP-Post eines XML zu einer geruhsamen webservice tun:Wie XML POST RestTemplate mit
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);
}
}
Dieser Controller sollte die XML-Nachricht konsumieren. Die Steuerung wurde geschrieben, um zu testen, dass der Client die XML-Nachricht in geeigneter Weise senden:
@RequestMapping("/")
@Controller
public class HomeController {
@RequestMapping(value = "/restCallConsumer", method = RequestMethod.POST)
public String restCallConsumer(String anXML) {
System.out.println("anXML: " + anXML);
return "aView";
}
}
meisten Beispiel fand ich mit RestTemplate unter Verwendung von XML um beinhaltet ein Objekt Mapping-Tool. Dieses Werkzeug ordnet Objekte einem XML zu und umgekehrt. In meinem Fall habe ich nur eine XML-Zeichenfolge, die ich per HTTP-Post senden möchte. Hat jemand erreicht, was ich versuche zu tun? Es könnte sein, dass der RestFul-Client nicht für das gedacht ist, was ich zu tun versuche. Jede Antwort wäre willkommen :)
EDIT
die XML-Nachricht von Serialisierung eine Karte mit Xstream hergestellt wird. Dies ist der Code, der das tut:
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);
Dieser Code soll die multimap in eine XML-Zeichenfolge konvertieren mit einem Konverter namens MapEntryConverter. Dies ist der Code für den Converter:
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();
}
}
}
EDIT
ich meinen Code per @artbristol empfohlen ändern. Ich sah dies in der Protokolldatei:
DEBUG: org.springframework.web.client.RestTemplate - Writing [] mit [[email protected]34263a]
Es ist wie die restTemplate aussieht, ist POST-ing der XML-Nachricht. Der Parameter anXML im Controller ist jedoch null. Bedeutet dies, dass die XML-Nachricht den Controller nicht erreichen konnte? Könnte es sein, dass der Controller nicht korrekt implementiert ist?
Darf ich wissen, warum Sie es unter anXMLMessage Feld erwartet? Versuche http://stackoverflow.com/questions/4118670/sending-multipart-file-as-post-parameters-with-resttemplate-requests – Rudy
@Rudy der XML-Nachricht selbst durch die Serialisierung eine Karte XStream Verwendung produziert werden. Ich werde diese Informationen zu meiner Frage hinzufügen. Danke für den Link :) – zfranciscus