238

テーブル上のオブジェクトを一覧表示するページがあり、テーブルをフィルター処理するためのフォームを配置する必要があるとします。フィルターは Ajax GET として次のような URL に送信されます: http://foo.com/system/controller/action?page=1&prop1=x&prop2=y&prop3=z

そして、コントローラーに多くのパラメーターを設定する代わりに、次のようにします。

@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
    @RequestParam(value = "page", required = false) int page,
    @RequestParam(value = "prop1", required = false) String prop1,
    @RequestParam(value = "prop2", required = false) String prop2,
    @RequestParam(value = "prop3", required = false) String prop3) { ... }

そして、私が MyObject を次のように持っていると仮定します:

public class MyObject {
    private String prop1;
    private String prop2;
    private String prop3;

    //Getters and setters
    ...
}

私は次のようなことをしたい:

@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
    @RequestParam(value = "page", required = false) int page,
    @RequestParam(value = "myObject", required = false) MyObject myObject,) { ... }

出来ますか?どうやってやるの?

4

7 に答える 7

308

アノテーションを削除するだけで@RequestParam、Spring はリクエストパラメーターをクラスインスタンスにクリーンにバインドします。

public @ResponseBody List<MyObject> myAction(
    @RequestParam(value = "page", required = false) int page,
    MyObject myObject)
于 2013-06-05T14:16:49.730 に答える
65

私からいくつかの短い例を追加します。

DTO クラス:

public class SearchDTO {
    private Long id[];

    public Long[] getId() {
        return id;
    }

    public void setId(Long[] id) {
        this.id = id;
    }
    // reflection toString from apache commons
    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}

コントローラ クラス内のリクエスト マッピング:

@RequestMapping(value="/handle", method=RequestMethod.GET)
@ResponseBody
public String handleRequest(SearchDTO search) {
    LOG.info("criteria: {}", search);
    return "OK";
}

クエリ:

http://localhost:8080/app/handle?id=353,234

結果:

[http-apr-8080-exec-7] INFO  c.g.g.r.f.w.ExampleController.handleRequest:59 - criteria: SearchDTO[id={353,234}]

私はそれが役立つことを願っています:)

更新/コトリン

現在、私は Kotlin で多くの作業を行っているため、誰かが同様の DTO を定義したい場合、Kotlin のクラスは次の形式にする必要があります。

class SearchDTO {
    var id: Array<Long>? = arrayOf()

    override fun toString(): String {
        // to string implementation
    }
}

このdataようなクラスでは:

data class SearchDTO(var id: Array<Long> = arrayOf())

Spring (Boot でテスト済み) は、回答に記載されている要求に対して次のエラーを返します。

「型 'java.lang.String[]' の値を必要な型 'java.lang.Long[]' に変換できませんでした。ネストされた例外は java.lang.NumberFormatException です: 入力文字列の場合: \"353,234\""

データ クラスは、次のリクエスト パラメータ フォームに対してのみ機能します。

http://localhost:8080/handle?id=353&id=234

これに注意してください!

于 2014-09-10T14:36:37.793 に答える
7

私は非常によく似た問題を抱えています。実は問題は思ったより深い。デフォルトとして使用するjquery$.postを使用Content-Type:application/x-www-form-urlencoded; charset=UTF-8しています。残念ながら、私はそれに基づいてシステムを構築しましたが、複雑なオブジェクトが必要になったときに、@RequestParamそれを実現することができませんでした。

私の場合、次のようなユーザー設定を送信しようとしています。

 $.post("/updatePreferences",  
    {id: 'pr', preferences: p}, 
    function (response) {
 ...

クライアント側では、サーバーに送信される実際の生データは次のとおりです。

...
id=pr&preferences%5BuserId%5D=1005012365&preferences%5Baudio%5D=false&preferences%5Btooltip%5D=true&preferences%5Blanguage%5D=en
...

として解析;

id:pr
preferences[userId]:1005012365
preferences[audio]:false
preferences[tooltip]:true
preferences[language]:en

サーバー側は次のとおりです。

@RequestMapping(value = "/updatePreferences")
public
@ResponseBody
Object updatePreferences(@RequestParam("id") String id, @RequestParam("preferences") UserPreferences preferences) {

    ...
        return someService.call(preferences);
    ...
}

私は試し@ModelAttribute、セッター/ゲッター、コンストラクターをすべての可能性で追加しましUserPreferencesたが、送信されたデータを5つのパラメーターとして認識したが、実際にはマップされたメソッドには2つのパラメーターしかないため、チャンスはありませんでした。私もBijuのソリューションを試しましたが、Springはデフォルトのコンストラクターで UserPreferences オブジェクトを作成し、データを入力しません。

クライアント側からプリファレンスの JSON 文字列を送信し、サーバー側で文字列であるかのように処理することで問題を解決しました。

クライアント:

 $.post("/updatePreferences",  
    {id: 'pr', preferences: JSON.stringify(p)}, 
    function (response) {
 ...

サーバ:

@RequestMapping(value = "/updatePreferences")
public
@ResponseBody
Object updatePreferences(@RequestParam("id") String id, @RequestParam("preferences") String preferencesJSon) {


        String ret = null;
        ObjectMapper mapper = new ObjectMapper();
        try {
            UserPreferences userPreferences = mapper.readValue(preferencesJSon, UserPreferences.class);
            return someService.call(userPreferences);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

簡単に言うと、REST メソッド内で手動で変換を行いました。私の意見では、Spring が送信されたデータを認識しない理由は content-type です。

于 2014-03-26T01:47:56.673 に答える
0

はい、簡単な方法でできます。以下の行のコードを参照してください。

URL - http://localhost:8080/get/request/multiple/param/by/map?name= 'abc' & id='123'

 @GetMapping(path = "/get/request/header/by/map")
    public ResponseEntity<String> getRequestParamInMap(@RequestParam Map<String,String> map){
        // Do your business here 
        return new ResponseEntity<String>(map.toString(),HttpStatus.OK);
    } 
于 2020-01-19T17:03:46.050 に答える