Comment publier XML à l'aide de RestTemplate

J'ai l'intention de POSTER un message XML à l'aide de Printemps Reste Modèle. Après un certain nombre d'échecs, je commence à douter si au Printemps Reste Modèle peut POSTER un message XML. C'est un havre de client que j'ai développé. Le RestTemplate est destiné à faire un HTTP post d'un XML pour un séjour Reposant webservice:

 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);
   }

}

Ce contrôleur est conçu pour consommer le message XML. Le contrôleur a été écrit pour tester que le client peut envoyer le message XML de façon appropriée:

@RequestMapping("/")
@Controller
public class HomeController {
@RequestMapping(value = "/restCallConsumer", method = RequestMethod.POST)
public String restCallConsumer(String anXML) {
System.out.println("anXML: " + anXML);  
return "aView";
 }
}

Plus de l'exemple que j'ai trouvé autour de l'utilisation de XML avec RestTemplate implique l'utilisation d'un objet, outil de cartographie. Cet outil maps objet XML et vice versa. Dans mon cas, je n'ai qu'une chaîne XML que je veux envoyer via HTTP post. Quelqu'un a accompli ce que je suis en train de faire ? Il se pourrait que Reposant client n'est pas prévu pour ce que je suis en train de faire. Une réponse serait appréciée 🙂

MODIFIER

Le message XML est produite par la sérialisation d'une Carte à l'aide Xstream. C'est le code qui fait que:

    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);

Ce code est destiné à convertir le multimap dans une chaîne XML à l'aide d'un convertisseur nommé MapEntryConverter. C'est le code pour le Convertisseur:

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();
    }
}

}

MODIFIER

- Je modifier mon code comme par @artbristol recommandé. J'ai vu cela dans le fichier journal:

DEBUG: org.springframework.web.client.RestTemplate - Écriture [
1
1
3
] à l'aide de [org.springframework.http.converter.StringHttpMessageConverter@1d34263a]

Il ressemble le restTemplate est POST-ing le message XML. Cependant, la anXML paramètre du contrôleur est null. Est-ce à dire que le message XML ne pourrait pas atteindre le contrôleur ? Se pourrait-il que le contrôleur n'est pas mis en œuvre correctement ?

  • Je peux savoir pourquoi vous attend sous anXMLMessage champ ? Essayez de stackoverflow.com/questions/4118670/...
  • le message XML lui-même sera le produit de la sérialisation d'une Carte à l'aide de XStream. Je vais ajouter cette information à ma question. Merci pour le lien 🙂
InformationsquelleAutor zfranciscus | 2013-03-11