1

このようなメソッドシグネチャを持つコントローラーがあります

@RequestMapping(value = "/{project:[A-Z0-9_+\\.\\(\\)=\\-]+}", method = RequestMethod.GET)
public ResponseEntity<Object> lookupProject(@PathVariable String project,
        @RequestParam(value = "fields", required = false) String fields,
        @RequestParam(value = "asList", required = false, defaultValue = "false") boolean asList);

JSON aCollection<Object>またはを返しますMap<String, Object>。これは XML には適していません。私はむしろProjectオブジェクトを返したいです。

どのコンテンツ タイプが生成されるかを明確に判断する方法はありますか? 回避策は、XML のみを生成してProjectオブジェクトを返す別の方法です。コードの重複は避けたいと思います。

私はSpring 3.1.3-RELEASEを使用しています。

4

5 に答える 5

2

Spring のドキュメントによると、生成パラメータは Accept に基づいてコンテンツを返します。

@RequestMapping(value="/someUrl/", produces="application/*")
public Project someControllerMethod(...)

メソッドが application/xml を受け取る場合、メソッドは XML を生成し、application/json の場合、json を生成します。

必要なのは、適切なオブジェクト タイプに合わせてマーシャラーをセットアップすることだけです。

ドキュメントはこちら:

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#produces ()

于 2012-11-07T18:25:05.667 に答える
0

生成されるコンテンツ タイプは、クライアントが受け入れるタイプによって異なります。これに対する 1 つの解決策は、produces 属性を使用することで既に説明されています。別の解決策は、Accept ヘッダーまたはその他のメカニズムに基づいてビューを解決できる ContentNegotiatingViewResolver を使用することです。

ドキュメントhttp://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.htmlを参照してください

例: http://www.mkyong.com/spring-mvc/spring-3-mvc-contentnegotiatingviewresolver-example/

于 2012-11-08T05:30:37.680 に答える
0

Dardo のソリューションが最適だと思いますが、XMLHttpMessageConverter を使用してオブジェクト タイプを検査し、Project オブジェクトの場合は別の方法でキャストできます。

于 2012-11-13T21:55:06.230 に答える
-3

私は2つの方法で分割することになりました。

パブリック メソッドの名前が に変更されましたlookupAsType。デリゲート/リターンの両方

String[] fieldsArray = StringUtils.split(fields, ',');
return lookup(project, fieldsArray, asList, mediaType);

新しいメソッドlookupには以前と同じコードがありますが、メディア タイプの if 句は含まれていません。

if (mediaType.equals(MediaType.APPLICATION_JSON)) {
    body = projectValues;
} else if (mediaType.equals(MediaType.APPLICATION_XML)) {
    body = new Project(projectValues);
} else {
    throw new NotImplementedException("Project lookup is not implemented for media type '" + mediaType + "'");
}

悪い点は、MediaType が列挙型ではなく醜いクラスであることです。

于 2012-11-08T10:46:13.110 に答える