Spring Rest テンプレートを使用して XML メッセージを POST するつもりです。何度も失敗した後、Spring Rest Template が XML メッセージを POST できるかどうか疑問に思い始めています。これは私が開発した Restful クライアントです。RestTemplate は、RestFul Web サービスへの XML の HTTP ポストを行うことを目的としています。
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 を使用して Map をシリアライズすることによって生成されます。これを行うコードは次のとおりです。
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が推奨するようにコードを変更します。ログファイルでこれを見ました:
デバッグ: org.springframework.web.client.RestTemplate - [org.springframework.http.converter.StringHttpMessageConverter@1d34263a] を使用して [ 1 1 3 ] を書き込む
restTemplate が XML メッセージを POST しているようです。ただし、コントローラーの anXML パラメーターは null です。これは、XML メッセージがコントローラーに到達できなかったことを意味しますか? コントローラーが正しく実装されていない可能性がありますか?