有关SpringMVC传递参数的问题

前台通过ajax提交json格式数据,如下

        $.ajax(
                {
                    url: "http://localhost:8090/lookup/getLookup",
                    type: "POST",
                    dataType: "json",
                    data: JSON.stringify({"lookupId":28}),
                    contentType: "application/json",
                    success: function (data, textStatus, jqXHR) {
                        alert(data.code)
                    },
                    error: function (data, textStatus, jqXHR) {
                        alert("ERROE");
                    }
                }
        );

这样请求的参数就是{"lookupId":28}

那么后台我是写的这样接收

    @ResponseBody
    @RequestMapping(value = {"getLookup"})
    public TsLookupTypeHelper getLookupByLookupId(@RequestBody Integer lookupId) {}

请求的时候会报错 400,请问要怎样在前台发送json数据,后台通过非javabean的参数(指的是 int string等基本类型)接受?

7个回答

400 是肯定的。 @RequestBody 接受一个Body内容作为参数。 你的body是 “{"lookupId":28}”字符串。不是Int 所以报400错
修改有2种方法。 修改 ajax data: "28",contentType: "application/text" 第二个 修改controller
public TsLookupTypeHelper getLookupByLookupId( Integer lookupId) {}

Drizzly_
Drizzly_ 回复Drizzly_: 但是你不管怎么接受 过来的应该是个字符串。 需要你手动转换成 json
大约 2 年之前 回复
Drizzly_
Drizzly_ 回复Drizzly_: 我是用的是 alibaba的 fastjson
大约 2 年之前 回复
Drizzly_
Drizzly_ 回复片刻清夏: 问题是出在前端。 后端接受 @RequestBody 的话。最好接受 JSONObject 对象
大约 2 年之前 回复
zjq_1314520
片刻清夏 回复Drizzly_: 我也觉得是前台的问题,前台台不愿意改代码,非要我后台接受!我现在用一个bean接受,然后通过get方法来获取相应的数据,但是还是感觉这样做并不是特别好!
大约 2 年之前 回复
Drizzly_
Drizzly_ 后台如果不能改。 前台 传入 28 即可
大约 2 年之前 回复
Drizzly_
Drizzly_ 后台删除 @RequestBody 即可
大约 2 年之前 回复
Drizzly_
Drizzly_ 回复片刻清夏: 首先 前台传参是错误的。 应该是json 对象。而不是 json 字符串。 后台接受要对应前台传入的参数。
大约 2 年之前 回复
zjq_1314520
片刻清夏 回复Drizzly_: 这样是可以的!但是前台的代码和后台接受的参数不能改变!后台能有办法比如注解或者配置啥的接受到吗?
大约 2 年之前 回复
Drizzly_
Drizzly_ 忘了说一点。 data: {"lookupId":28} ,
大约 2 年之前 回复

首先,你在ajax中使用的类型dataType为json,那么你就必须保证你的springMVC.xml配置文件中配置了接收json数据的contentNegotiationManager。检查下你的配置文件中有没有这个配置:

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <!-- 开启后缀匹配模式,.json请求会默认利用Jackson进行数据转换 -->
        <property name="favorPathExtension" value="true" />
        <property name="favorParameter" value="true" />
        <property name="mediaTypes" >
            <value>
                json=application/json
                xml=application/xml
            </value>
        </property>
    </bean> 

其次,如果没有的话,建议加上上述配置试试。

wojiushiwo945you
毕小宝 回复片刻清夏: 理论上就是你实现的这种方式,你实施前端的JSON包含多个属性,后端的RequestBody定义为一个具有指定属性的对象试试。我在开发中就是你这样传递参数的,后台直接定义成复杂对象接收。
大约 2 年之前 回复
zjq_1314520
片刻清夏 加上了,貌似也是不行!有没有一种办法能让前台传过来json字符串类型,后台能接受到里面的属性呢?
大约 2 年之前 回复

忘了说一点。 data: {"lookupId":28} ,

这样写就哦了


    @RequestMapping(value = {"getLookup"})
          @ResponseBody
    public TsLookupTypeHelper getLookupByLookupId( Integer lookupId) {}

zjq_1314520
片刻清夏 谢谢,感觉跟我写的没啥区别额……
大约 2 年之前 回复

大哥,看你写的咋这么复杂呢,很简单的一个操作
前端不需要转成json直接写:
$.ajax(
{
url: "http://localhost:8090/lookup/getLookup",
type: "POST",
dataType: "json",
data: {"lookupId":28},
success: function (data) {
alert(data.code)
},
error: function () {
alert("ERROE");
}
}
);

            后台:

@RequestMapping(value = {"/lookup/getLookup"})
public TsLookupTypeHelper getLookupByLookupId( Integer lookupId) {}

    注意:你前台传的类型是int类型,所以后我这块也用int类型接,如果是字符串 就用String去接就好了 只要保证参数名称和前端的一致就好,
    如果不一致则需要@RequestParam("lookupId")来去绑定,具体用法:
        @RequestMapping(value = {"/lookup/getLookup"})
public TsLookupTypeHelper getLookupByLookupId( @RequestParam("lookupId")Integer aaa) {}
    注意:aaa是随便起的参数名,但是通过上述的绑定 也是可以得到参数的
zjq_1314520
片刻清夏 回复newbie_no_1:哈哈
大约 2 年之前 回复
newbie_no_1
newbie_no_1 这么简单的事情,一个前端加上一个后端,硬生生搞复杂了
大约 2 年之前 回复
zjq_1314520
片刻清夏 是啊,谢谢,但是前台非要那么传,我也很无奈 。
大约 2 年之前 回复

请问楼主为什么前台一定要{"lookupId":28}这种方式来传递???

zjq_1314520
片刻清夏 其实前台使用的TypeScript,然后就直接封装成一个类传过来了!很痛苦!上面的代码是我用jq'模拟的!
大约 2 年之前 回复

别听楼上的,400是非法参数,比如你前台传递一个"28",后台用Integer来接受,就会报400
你换成一个String来接受试试

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问