Spring MVCにおけるコレクションパラメータの受け取り方

Spring MVCでフォームやAjaxリクエストから、リストなどのコレクション型パラメータを受け取る方法を2つ紹介します。

方法1:POJOラッパーを使用する

コレクションをプロパティとして持つラッパーオブジェクトを定義し、そのオブジェクトをコントローラの引数で受け取ります。

ラッパークラス

public class RequestForm {
    private List<Member> members;

    // getter / setter
    public List<Member> getMembers() { return members; }
    public void setMembers(List<Member> members) { this.members = members; }
}

注意:メンバークラスのフィールドにはラッパー型ではなく、基本型(intなど)を使用しないとエラーになる場合があります。

コントローラ

@PostMapping("/submit")
@ResponseBody
public ModelAndView handleList(RequestForm form) {
    List<Member> members = form.getMembers();
    members.forEach(m -> System.out.println(m));
    ModelAndView mv = new ModelAndView("result");
    mv.addObject("memberList", members);
    return mv;
}

フォーム(JSP)

<form action="/submit" method="post">
    名前1: <input type="text" name="members[0].name"><br>
    年齢1: <input type="text" name="members[0].age"><br>
    名前2: <input type="text" name="members[1].name"><br>
    年齢2: <input type="text" name="members[1].age"><br>
    <input type="submit" value="送信">
</form>

結果表示(JSP)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table border="1">
    <thead>
        <tr>
            <td>名前</td>
            <td>年齢</td>
        </tr>
    </thead>
    <tbody>
        <c:forEach var="m" items="${memberList}">
            <tr>
                <td>${m.name}</td>
                <td>${m.age}</td>
            </tr>
        </c:forEach>
    </tbody>
</table>

方法2:@RequestBody + Ajax(JSON)

JavaScriptからJSON形式で配列を送信し、コントローラ側で@RequestBodyアノテーションを使って直接受け取る方法です。

コントローラ

@PostMapping("/ajax-receive")
@ResponseBody
public void receiveList(@RequestBody List<Member> members) {
    members.forEach(m -> System.out.println(m.getName() + " : " + m.getAge()));
}

クライアント側(JavaScript/jQuery)

<script>
    let users = [
        { name: "田中太郎", age: 25 },
        { name: "鈴木花子", age: 30 }
    ];
    $(function() {
        $("#sendBtn").click(function() {
            $.ajax({
                url: "/ajax-receive",
                type: "POST",
                data: JSON.stringify(users),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(res) {
                    console.log("送信成功");
                }
            });
        });
    });
</script>

contentTypeにapplication/jsonを指定することが重要です。また、JacksonなどのJSONライブラリがクラスパスに存在する必要があります。

タグ: spring-mvc RequestBody AJAX JSON java-list

10月5日 12:04 投稿