2013-03-11 23 views
6

Spring Rest Şablonunu kullanarak bir XML mesajını POST niyetinde tutmayı düşünüyorum. Bir dizi başarısızlıktan sonra, Spring Rest Şablonunun bir XML mesajını POST yapıp yapamayacağından şüphe etmeye başlıyorum. Bu geliştirdiğim bir Restful istemcisidir. RestTemplate dinlendirici webcoder bir XML HTTP yazı yapmak amaçlanmaktadır:RestTemplate kullanarak XML POST Nasıl Yapılır

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

}

Bu kontrolör XML mesajı tüketmek için tasarlanmıştır. Kontrolör istemci uygun XML mesaj gönderebileceği test etmek yazılmıştır:

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

Ben RestTemplate ile XML kullanarak çevresinde bulunan örnek çoğu

bir nesne haritalama aracını kullanarak içerir. Bu araç nesneyi bir XML ile eşleştirir ve tersini yapar. Benim durumumda, sadece HTTP gönderimi yoluyla göndermek istediğim bir XML dizilim var. Benim yapmaya çalıştığım şeyi yapan var mı? RestFul istemcisinin yapmaya çalıştığım şey için tasarlanmamış olması olabilir. Herhangi bir cevap mutluluk duyacağız :)

XML mesaj Xstream kullanarak bir harita seri üretilir

DÜZENLEME. Bu kod MapEntryConverter adlı bir dönüştürücü kullanarak bir XML dizesine Multimap dönüştürmek için tasarlanmıştır

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

: Bu bunu yapmaz koddur.

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

} 

DÜZENLEME

ben tavsiye @artbristol göre benim kodunu değiştirmek: Bu Dönüştürücü kodudur. [[email protected]34263a]

kullanarak Yazma [] - org.springframework.web.client.RestTemplate:

DEBUG: Ben günlük dosyasında bu gördüğümüz

RestTemplate XML mesajını POST-gönderir gibi görünüyor. Ancak, denetleyicideki anXML parametresi boş. Bu, XML mesajının denetleyiciye ulaşamadığı anlamına mı geliyor? Denetleyici doğru şekilde uygulanamadı mı?

+0

Neden bir XMLMessage alanı altında beklediğinizi anlayabilir miyim? Http://stackoverflow.com/questions/4118670/sending-multipart-file-as-post-parameters-with-resttemplate-requests – Rudy

+0

@Rudy'yi deneyin. XML mesajının kendisi XStream kullanarak bir Harita serileştirilerek üretilecektir. Bu bilgiyi soruma ekleyeceğim. Bağlantı için teşekkürler :) – zfranciscus

cevap

2

Spring'in JAXB marşal mesaj dönüştürücüsünü kullanmanıza gerek yoktur - bu işlemi zaten String içine koyarak yaptınız. Sadece String'u (kodunuzda olduğu gibi) POST yapmak işe yaramalı (String.class argümanını kaybedin, URL değişkenleri için tasarlanmıştır ve setMessageConverters çağrısından kurtulun, çünkü bu varsayılan StringHttpMessageConverter çalışmasını engelliyor).

+0

Çalışıyor gibi görünüyor :) Ancak, XML mesajını denetleyicide basamıyorum. XML mesajı boş. Soruma daha fazla bilgi ekledim.Teşekkürler @artbristol – zfranciscus

+0

'StringHttpMessageConverter' varsayılan olarak, istediğiniz '' text/html' 'yerine' 'İçerik-Tür: text/plain '' HTTP üstbilgisini eklediğini - doğru şekilde yapılandığını fark ettim (' Jaxb2RootElementHttpMessageConverter' konfigürasyonunda] senin sorunun içinde) düzeltmek olabilir – artbristol

+0

@artbristol Ben de benzer bir sorum var [burada] (http://stackoverflow.com/questions/27758462/how-to-post-xml-data-through-resttemplate-in-the-body 'RestTemplate' üzerinde istek üzerine). Mümkünse, bana yardım edebilir misin? Bunu bir süreliğine takılıyorum ve nasıl çalıştığını anlayamıyorum. Herhangi bir yardım büyük takdir edilecektir. – john

İlgili konular