なんだかGoodVibes

日々の勉強メモです。

【Java】JsonAnySetterでパラメータを受け取る

こんにちは。
本日はJavaメモです。

概要

APIでデータを受けるとき、
特定のクラスを指定していました。

以下の記事でも、全パラメータを指定したクラスを作成しています。

【JavaScript】fetch()を使ってみる - なんだかGoodVibes

JsonAnySetterを使用すると
パラメータの設定が不要になったり、
特定のパラメータ以外はすべて一個にまとめたりとかできちゃいます。


サンプルコード

サンプルでは、idのみパラメータを用意し、
その他のパラメータはothersに追加されるようにしています。

@RestController
@RequestMapping("/api")
public class JsonAnySetterSample {
    public static class ReqPamater {
        private String id;
        private Map<String, String> others = new LinkedHashMap<>();
        
        public void setId(String id) {
            this.id = id;
        }

        public String getId() {
            return this.id;
        }

        @JsonAnySetter
        public void setOthers(String k, String v) {
            this.others.put(k, v);
        }

        public Map<String, String> getOthers() {
            return this.others;
        }
    }

    @PostMapping("postReq")
    public void postMethod(@RequestBody ReqPamater req) {
        for (Map.Entry<String, String> item : req.getOthers().entrySet()) {
            System.out.println(item.getKey() + ": " + item.getValue());
        }
    }
}

データ送信側はjavascriptです

async function anySetterBtnClicked() {
    const sendData = {
        'id': '2',
        'name': 'Bob',
        'age': '100',
        'color': 'yellow'
    }

    const options = {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(sendData)
    }

    const p = await fetch("http://localhost:8090/api/postReq", options)
}

Javaの出力は以下のようになります。

name: Bob
age: 100
color: yellow

id以外のパラメータがothersにセットされています。



以上です。