스프링 레스트 템플릿을 사용하여 XML 메시지를 POST하려고합니다. 여러 번 실패한 후에 Spring Rest Template이 XML 메시지를 POST 할 수 있는지 의심 스럽습니다. 이것은 내가 개발 한 편안한 클라이언트입니다. RestTemplate은 편안한 웹 서비스에 XML의 HTTP 게시물을 할 것입니다 :RestTemplate을 사용하여 XML을 POST하는 방법
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);
}
}
이 컨트롤러는 XML 메시지를 소비하기위한 것입니다. 컨트롤러는 클라이언트가 적절하게 XML 메시지를 보낼 수 있는지 테스트하기 위해 작성되었습니다
@RequestMapping("/")
@Controller
public class HomeController {
@RequestMapping(value = "/restCallConsumer", method = RequestMethod.POST)
public String restCallConsumer(String anXML) {
System.out.println("anXML: " + anXML);
return "aView";
}
}
내가 RestTemplate으로 XML을 사용하여 주변에있는 예제의 대부분을
객체 매핑 도구를 사용하여 포함한다. 이 도구는 객체를 XML에 매핑하고 그 반대의 경우도 마찬가지입니다. 제 경우에는 HTTP 게시물을 통해 보내려는 XML 문자열 만 있습니다. 누구든지 내가하려는 일을 성취 했습니까? RestFul 클라이언트는 내가하려는 것을 의도하지 않았을 수 있습니다. 모든 답은 평가 될 것입니다 :XML 메시지는 XStream을을 사용하여지도를 직렬화에 의해 생성된다
편집 할 수 있습니다.
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);
이 코드는 MapEntryConverter라는 변환기를 사용하여 멀티 맵을 XML 문자열로 변환하기위한 것입니다.
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();
}
}
}
편집
내가 추천 @artbristol에 따라 코드를 변경 :이 변환기에 대한 코드입니다. [[email protected]34263a]
를 사용하여 작성 [] - org.springframework.web.client.RestTemplate :DEBUG : 나는 로그 파일에 이것을보고
restTemplate이 XML 메시지를 POST하는 것처럼 보입니다. 그러나 컨트롤러의 anXML 매개 변수는 null입니다. 이것은 XML 메시지가 컨트롤러에 도달 할 수 없다는 것을 의미합니까? 컨트롤러가 올바르게 구현되지 않았습니까?
XML 메시지 필드에서 예상하는 이유를 알 수 있습니까? http://stackoverflow.com/questions/4118670/sending-multipart-file-as-post-parameters-with-resttemplate-requests – Rudy
@Rudy XML 메시지 자체는 XStream을 사용하여 Map을 serialize하여 생성됩니다. 나는 그 정보를 내 질문에 추가 할 것이다. 링크 주셔서 감사합니다 :) – zfranciscus