フロントエンドネストオブジェクトパラメータをspring mvcに渡す


springmvcを用いてwebアプリケーションを開発する際,springmvcのcontroller法がメソッドのパラメータオブジェクトにパラメータを自動的に注入できると感じ,開発が極めて便利になった.しかし、ネストされたオブジェクトがある場合、例えば受注オブジェクトにユーザーオブジェクトという属性があると、扱いにくい.1つのケースでは,伝達されたパラメータはpostメソッドの要求体として用いられ,RequestBodyで注釈することができる.しかし、条件が満たされないと、この方法は使えません.多くの人が好む方法は、オブジェクトをjson文字列にシーケンス化し、json文字列を受信してから逆シーケンス化することです.この方法は問題を解決することができますが、時にはトラブルにも遭遇します.例えば汎用型がある場合、例えばcontrollerは注釈を使っていくつかのパラメータを検証します.この時、私たちはこのような状況を適用する新しい方法を望んでいます.次のコードは、jsのネストされたオブジェクトをhttpリクエストパラメータに変換するkey=value標準形式をjsで実装し、サービス側に渡すものです.サービス側のcontrollerは、http標準パラメータ形式でサポートされている方がよいため、controllerパラメータのネストされたオブジェクトに容易に注入できます.
/**
 *  js   key=value    http     key=value  。 
 * js  value    ,  ,    (  、   ,  ),
    springmvc       ,     。
 *            。        json     。
       ,         。
 */
let toHttpParams = (function(){
    function serialize(key, value, param) {
        if(Array.isArray(value)) {
            for(let i = 0; i < value.length; i++) {
                serialize(key + '[' + i + ']', value[i], param)
            }
        } else if(value != undefined && value.constructor === Object) {
            for(let k in value) {
                serialize(key + '.' + k, value[k], param);
            }
        } else {
            param[key] = value;
        }
    }
    function serializeObj(obj) {
        const param = {};
        for(let k in obj) {
            serialize(k, obj[k], param);
        }
        return param;
    }
    return serializeObj;
})();