6

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 メッセージがコントローラーに到達できなかったことを意味しますか? コントローラーが正しく実装されていない可能性がありますか?

4

1 に答える 1

2

Spring の JAXB マーシャリング メッセージ コンバーターを使用する必要はありませんString。(コードのように) POSTするだけでうまくいくStringはずです(ただし、URL変数を対象とした引数を失い、デフォルトが機能しないため、呼び出しString.classを取り除きます)。setMessageConvertersStringHttpMessageConverter

于 2013-03-11T11:04:39.283 に答える