NutzCN Logo
问答 ajax怎么传对象集合给后台?
发布于 12天前 作者 qq_4ad560c4 390 次浏览 复制 上一个帖子 下一个帖子
标签:

用了 @AdaptBy(type= JsonAdaptor.class) 注解
接收参数是 @Param("orderEntryList") List orderEntryList

前端这几种传参方式都不行,收到的都是null

orderEntryList: orderEntryList
orderEntryList: JSON.parse(orderEntryList)
orderEntryList: JSON.stringify(orderEntryList)
17 回复
data : JSON.stringify(orderEntryList)

接收参数 @Param("orderEntryList") List orderEntryList

JSON.stringify() 用这个,后台收到的集合长度是1,第一个对象是json字符串,然后就抛转类异常

咋还不能发尖括号,难怪泛型被去掉了

 @Param("orderEntryList") List<OrderEntry> orderEntryList

这样传json字符串的话,后台还要再转换啊,怎么直接用对象集合接收呢

去掉 @Param ,麻烦把文档看一眼呀,适配器哪一章就有demo,传对象跟传数组是一个道理

看了啊。。为什么要去掉这个注解呢? 之前和移动端的对接口,同样的方法就行得通

那很明显, 移动端发的数据不一样

去掉这个注解更不行了,连 orderEntryList: JSON.stringify(orderEntryList) 也是null了

我擦,到底怎么弄啊,大哥你到底懂不懂nutz啊,不懂不要毁人不倦啊 /哭

呵呵, 我说写

data : JSON.stringify(orderEntryList) // 这是整个请求体都是JSON字符串

你偏要写

orderEntryList: JSON.stringify(orderEntryList) // 这是当表单参数发, 不报错才怪呢.

至于我懂不懂nutz, 我自己评价不了, 看看有没有第三方评价一下吧

敢说nutz帮主不懂nutz 啊哈哈哈……围观

改了,还是null。后台方法不止这一个参数的,还有其它参数,还在其它地方用到了

function submitFrom() {
        var orderEntryList = new Array();
        $("input[id^='sn_']").each(function () {
            var sn = $(this).val();
            var id = $(this).attr("id").replace("sn_","");
            var map = {};
            map["id"] = id;
            map["sn"] = sn;
            orderEntryList.push(map);
        });
        $.post("${base}/platform/goods/order/editEntryDo",
            {
                data: JSON.stringify(orderEntryList)
            },
            function (data) {
                if (data.code == 0) {
                    Toast.success("成功!");
                    return;
                    setTimeout(function () {
                        $("#goBack")[0].click();
                    }, 1000);
                } else {
                    Toast.error(data.msg);
                }
            },
            "json"
        );
    }
public Object editEntryDo(@Param("orderEntryId") String orderEntryId, @Param("backNews") String backNews ,  List<logistics_orderentry> orderEntryList, HttpServletRequest req)
function submitFrom() {
        var orderEntryList = new Array();
        $("input[id^='sn_']").each(function () {
            var sn = $(this).val();
            var id = $(this).attr("id").replace("sn_","");
            var map = {};
            map["id"] = id;
            map["sn"] = sn;
            orderEntryList.push(map);
        });
        $.ajax({
             url : "${base}/platform/goods/order/editEntryDo",
             // 注意看这一行, 既然需要多个参数, 那就做个map
            data : JSON.stringify({"orderEntryList": orderEntryList, "orderEntryId": orderEntryId, "backNews" : backNews}),
            function (data) {
                if (data.code == 0) {
                    Toast.success("成功!");
                    return;
                    setTimeout(function () {
                        $("#goBack")[0].click();
                    }, 1000);
                } else {
                    Toast.error(data.msg);
                }
            },
            dataType : "json",
            type : "POST",
            contentType: 'application/json', //非常重要
        );
    }

对应的入口方法

@AdaptBy(type= JsonAdaptor.class) 
public Object editEntryDo(@Param("orderEntryId") String orderEntryId, @Param("backNews") String backNews ,  @Param("logistics_orderentry")List<logistics_orderentry> orderEntryList, HttpServletRequest req)

我说的data, 是$.ajax({data:xxx}) 里面的data, $.post是快捷方法, 第二个参数就是data,直接传值才是对的, 否则又变成表单了

既然是多个参数, 那么json序列化一个map就好了, 然后入口方法就可以用不同的key去匹配.

另外, 如果没有 @AdaptBy(type= JsonAdaptor.class) 按表单发送的时候应该报json错误. 但它没报错, 那证明body被读取了, 原因就是content type没设置, $.post是不好设置Content-Type的, 所以我改成常用的$.ajax方式了. 好像还有$.postJson之类的方法吧.

上面的代码貌似有语法错误, 缺了个大括号, 意会意会

感谢,照最后的思路解决了问题。
为我的莽撞向您道歉,自己是个半吊子,水平不够,总是搞些不明所以的问题既气自己又气别人。真的真的非常感谢你愿意给我们解惑,换作别人早把我拉黑了。
最后,我肯定知道nutz是你的作品,只是抖个机灵而已。。

添加回复
请先登陆
回到顶部