2013-03-11 4 views
6

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?

+0

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

+0

@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

Antwort

2

Sie müssen den JAXB-Marshalling-Nachrichtenkonverter von Spring nicht verwenden - Sie haben die Arbeit bereits erledigt, indem Sie ihn in eine String umgewandelt haben. POSTen einfach die String (wie in Ihrem Code) funktionieren sollte (obwohl das String.class Argument verlieren, ist, dass für die URL-Variablen bestimmt, und der setMessageConverters Ruf loszuwerden, denn das ist die Standardeinstellung verhindert wird StringHttpMessageConverter von der Arbeit).

+0

Es sieht aus wie es funktioniert :) Allerdings konnte ich die XML-Nachricht im Controller nicht ausdrucken. Die XML-Nachricht ist null. Ich habe mehr Informationen in meine Frage eingefügt.Danke @artbristol – zfranciscus

+0

Ich bemerkte, dass der 'StringHttpMessageConverter' standardmäßig den HTTP-Header' Content-Type: text/plain' anstelle des gewünschten 'text/html' hinzufügt - dies richtig zu konfigurieren (in der Art, wie Sie' Jaxb2RootElementHttpMessageConverter' konfiguriert haben) in Ihrer Frage) könnte es – artbristol

+0

@artbristol beheben ich habe auch ähnliche Frage [hier] (http://stackoverflow.com/questions/27758462/how-to-post-xml-data-through-resttemplate-in-the-body -of-request) auf 'RestTemplate'. Wenn möglich, kannst du mir helfen? Ich stecke eine Weile darauf und kann nicht verstehen, wie es funktioniert. Jede Hilfe wird sehr geschätzt. – john