-1

次のように、すでに機能しているjavascript AJAX POSTがあります。

クライアント側:

<script language="JavaScript" type="text/javascript">
    var column = "test1";
    var filterType = 1;
    var values = [];
    var filter = { "column" : column, "filterType" : filterType, "values": values};
    var filter2 = { "column" : column, "filterType" : filterType, "values": values};
    filter2.column = "test2";
    var filters = new Array();
    filters[0] = filter;
    filters[1] = filter2;

    $.ajax({  
        url: "${pageContext.request.contextPath}/api/user_administration/get", 
        data: JSON.stringify(filters),  
        type: "POST", 
        beforeSend: function(xhr) 
        {  
            xhr.setRequestHeader("Accept", "application/json");  
            xhr.setRequestHeader("Content-Type", "application/json");  
        },
        success: function(user)
        {  

        }
    });
</script>

サーバ側:

@RequestMapping(value = "user_administration/get", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<User> get(@RequestBody ColumnFilter[] filters)
{
    //do something
    return userService.getAll();
}

ここで、2 つ以上のパラメーターを渡したいと思います。このようなもの:

@RequestMapping(value = "user_administration/get", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<User> get(@RequestBody ColumnFilter[] filters, @RequestBody ColumnSorter[] sorters)
{
    //do something
    return userService.getAll();
}

これを達成することは可能ですか?どのように?

(私はそれらを別のオブジェクト/クラス/エンティティにカプセル化できることをすでに認識しています)

4

2 に答える 2

0

あなたのAJAX呼び出しには、次の行があります

 data: JSON.stringify(filters),  

この行を変更または拡張して、リクエストにパラメータを追加します。また、何が起こっているのか明確でない場合、またはログ/診断/デバッグする必要がある場合は、いつでも中間変数を使用できます..

dataJavascript のキー値オブジェクト (名前付きパラメーターを指定)、文字列として渡すか、既存のコードと同様にオブジェクトを JSON エンコードして渡すことができます。

より多くのフィールド/パラメーターを渡したいようで、すでに JSON エンコードを使用しているように見えるため、JSON エンコードの前にこれらをより大きな「ペイロード」オブジェクトに組み込むことがおそらく最も理にかなっています。

 var paramData = {filter:filters, sorters: mySortersOrWhatever};
 console.log('some administration AJAX request', paramData);
 $.ajax({ 
     ...
     data: JSON.stringify(paramData)

これがSpringのリクエスト解析とどのようにインターフェースするかを見てください - Spring側で2つの別々のパラメータをデコードするには、名前(リクエストボディだけでなく)が必要になるか、名前付きパラメータからそれらをデコードするか、または(最も簡単な)1つの大きなものを受け入れるだけですパラメーターとしての JSON オブジェクト。

これはかなり単純明快です。いつものように、基本的なソフトウェア エンジニアリングの原則 (ログを記録し、診断し、機能するまで修正する) に従って、必要な機能を構築できます。

于 2013-11-13T10:12:36.653 に答える
0

春のドキュメントは言う:

@RequestBody メソッド パラメータ アノテーションは、メソッド パラメータを HTTP リクエスト ボディの値にバインドする必要があることを示します。

これは、HTTP リクエストのボディが分割できないことを前提としています。したがって、必要なのは回避策に従うことだけです。ここでは、Spring REST multiple @RequestBody parameters, possible?というまったく同じ質問を見ることができます。

于 2013-11-13T10:17:54.073 に答える