首页 > 解决方案 > 将从 Javascript 发送的列表映射到 Java 后端

问题描述

我正在尝试将 json 对象列表从 Javascript 发送到 Spring Boot 后端。这就是我的函数在前端的样子:

function submit() {
        var toSend = JSON.stringify(toBeAdded);
        console.log(toSend);
        $.post("assets",
            toSend,
            data => {
                populate(data);
                toBeAdded = [];
            });
    }

所以我发送一个类似的列表: [{"name":"foo1","description":"bar1","value":"4"}, {"name":"foo2","description":"bar2" "值":"10"}]

但我无法在后端捕捉到它:

@RequestMapping(value = "/assets", method = RequestMethod.POST)
    public void insertAssets(List<AssetDto> data, HttpSession session) {
        System.out.println(data);
}

AssetDto 看起来像:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class AssetDto implements Serializable {
    private String name;
    private String description;
    private int value;
}

所以在这种情况下我有一个错误(没有找到接口 java.util.List 的主要或单个公共构造函数 - 也没有找到默认构造函数)。但是我也尝试了一个字符串(我得到了空值),而使用 JSONArray 我得到了一个空列表。有人可以帮我吗?

标签: javascriptjavajson

解决方案


在请求中添加 Content-Type: application/json标头以提及您发送 JSON 数据。您应该使用$.ajax函数,因为$.post不允许添加标题。

function submit() {
        var toSend = JSON.stringify(toBeAdded);
        console.log(toSend);
        $.ajax({
            url: 'assets',
            type: 'post',
            data: toSent,
            contentType: "application/json; charset=utf-8",
            success: function (data){
                        populate(data);
                        toBeAdded = [];
                     }
        });
    }

在服务器端使用@RequestBody参数之前的注释。

@RequestMapping(value = "/assets", method = RequestMethod.POST)
public void insertAssets(@RequestBody List<AssetDto> data, HttpSession session) {
    System.out.println(data);
}

推荐阅读