2013-03-11 44 views
6

Tôi định gửi một thông báo XML bằng cách sử dụng Spring Rest Template. Sau một số lỗi, tôi bắt đầu nghi ngờ liệu Spring Rest Template có thể POST một thông điệp XML hay không. Đây là một khách hàng Restful mà tôi đã phát triển. Các RestTemplate được thiết kế để làm một bài HTTP của một XML để một webservice RESTful:Cách POST XML bằng cách sử dụng RestTemplate

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

}

điều khiển này được thiết kế để sử dụng tin nhắn XML. Bộ điều khiển được viết để kiểm tra xem khách hàng có thể gửi tin nhắn XML một cách thích hợp:

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

Hầu hết các ví dụ tôi tìm thấy xung quanh sử dụng XML với RestTemplate liên quan đến việc sử dụng một công cụ lập bản đồ đối tượng. Công cụ này ánh xạ đối tượng tới một XML và ngược lại. Trong trường hợp của tôi, tôi chỉ có một chuỗi XML mà tôi muốn gửi qua bài đăng HTTP. Có ai hoàn thành những gì tôi đang cố gắng làm không? Nó có thể là RestFul khách hàng không dành cho những gì tôi đang cố gắng để làm. Bất kỳ câu trả lời sẽ được đánh giá cao :)

EDIT nhắn

XML được sản xuất bởi serializing một bản đồ sử dụng xStream. Đây là mã thực hiện điều đó:

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

Mã này nhằm chuyển đổi đa thành chuỗi XML bằng trình chuyển đổi có tên MapEntryConverter. Đây là mã cho chuyển đổi:

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

tôi thay đổi mã của tôi theo @artbristol khuyến khích. Tôi thấy điều này trong file log:

DEBUG: org.springframework.web.client.RestTemplate - Viết [] sử dụng [[email protected]34263a]

Dường như restTemplate đang POST-ing thông điệp XML. Tuy nhiên, tham số anXML trong bộ điều khiển là null. Điều này có nghĩa là thông điệp XML không thể tới được bộ điều khiển? Nó có thể được rằng bộ điều khiển không được thực hiện một cách chính xác?

+0

Tôi có thể biết lý do bạn mong đợi nó trong trường anXMLMessage không? Hãy thử http://stackoverflow.com/questions/4118670/sending-multipart-file-as-post-parameters-with-resttemplate-requests – Rudy

+0

@Rudy bản thân thông điệp XML sẽ được tạo ra bằng cách nối tiếp Bản đồ bằng XStream. Tôi sẽ thêm thông tin đó vào câu hỏi của mình. Cảm ơn bạn đã liên kết :) – zfranciscus

Trả lời

2

Bạn không cần phải sử dụng công cụ chuyển đổi thư JAXB marshalling của Spring - bạn đã hoàn thành công việc bằng cách biến nó thành một String. Chỉ cần POST các String (như trong mã của bạn) nên làm việc (mất các đối số String.class mặc dù, đó là dành cho các biến URL, và thoát khỏi cuộc gọi setMessageConverters, bởi vì đó là ngăn chặn mặc định StringHttpMessageConverter từ làm việc).

+0

Dường như nó hoạt động :) Tuy nhiên, tôi không thể in ra thông báo XML trong bộ điều khiển. Thông báo XML là null. Tôi đã thêm thông tin trong câu hỏi của mình.Cảm ơn bạn @artbristol – zfranciscus

+0

Tôi nhận thấy rằng 'StringHttpMessageConverter' theo mặc định thêm tiêu đề HTTP' Content-Type: text/plain' thay vì 'text/html' mong muốn - cấu hình đúng (theo cách bạn đã cấu hình' Jaxb2RootElementHttpMessageConverter' trong câu hỏi của bạn) có thể sửa chữa nó – artbristol

+0

@artbristol Tôi cũng có câu hỏi tương tự [ở đây] (http://stackoverflow.com/questions/27758462/how-to-post-xml-data-through-resttemplate-in-the-body -of-request) trên 'RestTemplate'. Nếu có thể, bạn có thể giúp tôi không? Tôi bị mắc kẹt trong đó một thời gian và không thể hiểu làm thế nào để làm cho nó hoạt động. Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào. – john

Các vấn đề liên quan