2013-03-11 4 views
6

스프링 레스트 템플릿을 사용하여 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 메시지가 컨트롤러에 도달 할 수 없다는 것을 의미합니까? 컨트롤러가 올바르게 구현되지 않았습니까?

+0

XML 메시지 필드에서 예상하는 이유를 알 수 있습니까? http://stackoverflow.com/questions/4118670/sending-multipart-file-as-post-parameters-with-resttemplate-requests – Rudy

+0

@Rudy XML 메시지 자체는 XStream을 사용하여 Map을 serialize하여 생성됩니다. 나는 그 정보를 내 질문에 추가 할 것이다. 링크 주셔서 감사합니다 :) – zfranciscus

답변

2

여러분은 이미 Spring의 JAXB 마샬링 메시지 변환기를 사용할 필요가 없습니다. 이미 여러분은 이것을 String으로 만들었습니다. 그냥 String (코드 에서처럼)을 게시해야합니다 (URL 변수를위한 것으로 String.class 인수를 잃어 버리며 이 작동하지 않으므로 setMessageConverters 호출을 제거해야합니다).

+0

그것은 작동하는 것처럼 보입니다 :) 그러나, 나는 컨트롤러에서 XML 메시지를 출력 할 수 없었습니다. XML 메시지가 null입니다. 내 질문에 더 많은 정보를 추가했습니다.고맙습니다. @artbristol – zfranciscus

+0

'StringHttpMessageConverter'는 기본적으로 원하는'text/html'보다는 HTTP 헤더'Content-Type : text/plain'을 추가하는 것으로 나타났습니다. - 올바르게 설정하는 것 ('Jaxb2RootElementHttpMessageConverter' 귀하의 질문에) 그것을 해결할 수도 – artbristol

+0

@ artbristol 나는 또한 [이 질문에 [이 여기에있다] (http://stackoverflow.com/questions/27758462/how-to-post-xml-data-through-resttemplate-in-the-body -of-request)를 RestTemplate에 추가합니다. 가능하다면 나를 도울 수 있습니까? 나는 잠시 동안 그것에 붙어 있고 그것이 작동하게하는 방법을 이해할 수 없다. 어떤 도움이라도 대단히 감사하겠습니다. – john

관련 문제