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ı?
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
@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