postmapping接收json参数后返回404
问题描述
js中传递json数据给后端,后端可以正常接收参数,但返回404。
js
function rootconfirm(ids, types) { $.tool.confirm("确定结束" + options.modalname + "?", function () { $.ajax({ type: "post", url: options.confirmurl, traditional: true, data: { 'ids': ids, 'types': types }, success: function (json) { $.tool.ajaxsuccess(json); $.tableutil.refresh(); }, error: $.tool.ajaxerror }); }, function () {}, 5000); }
后台
@requirespermissions(value = {"root_orders:confirm", "root_orders:batchconfirm"}, logical = logical.or) @postmapping(value="/root_orders/confirm") public responsevo rootconfirmorder(long[] ids, string[] types) { if (ids == null || types == null) return resultutil.error(500, "请至少选择一个订单"); for (int i = 0; i < ids.length; i++) { /*可以正常打印*/ system.out.println("" + ids[i] + ":" + types[i]); } return resultutil.success("成功结束 [" + ids.length + "] 个订单"); }
解决
添加**@responsebody**注解。因为我的函数,所在的类注解是@controller,但函数是要返回数据而非视图的。
补充
@restcontroller
这个注解相当于@responsebody 和 @controller两个注解的组合,不返回视图,只返回数据。如果一个类上加了这个注解,那么这个类的函数都是返回不了视图的,return “redirect:/xxx/details”;也会只在页面上显示return的字符串。
解决方法是把类上的注解改为@controller,然后给不返回视图,只返回数据的函数加上注解@responsebody。
@postmapping注解解析
开发过程idea提示如将
@requestmapping(value="/abc" , method = “requestmethod.post”)
替换成@postmapping。现对@postmapping的实现。
@postmapping是一个复合注解,spring framework 4.3引入了@requestmapping注释的变体,以更好地表示带注释的方法的语义,作为@requestmapping(method = requestmethod.post)的快捷方式。
也就是可以简化成@postmapping(value="/abc" )即可,主要是方便识记。
下面很多方法都是对应着@requestmapping的标记的别名。
@requestmapping(value = “”, path = “”, params = “”, headers = “”,consumes = “”, produces = “”)
@target(elementtype.method) @retention(retentionpolicy.runtime) @documented @requestmapping(method = requestmethod.post) public @interface postmapping { /** * requestmapping 的别名, */ @aliasfor(annotation = requestmapping.class) string name() default ""; /** *requestmapping#value的别名, 默认为空字符串,一般需要自己填写 */ @aliasfor(annotation = requestmapping.class) string[] value() default {}; /** * requestmapping#path的别名 */ @aliasfor(annotation = requestmapping.class) string[] path() default {}; /** * requestmapping#params的别名 */ @aliasfor(annotation = requestmapping.class) string[] params() default {}; /** * requestmapping#headers的别名 */ @aliasfor(annotation = requestmapping.class) string[] headers() default {}; /** * requestmapping#consumes的别名 */ @aliasfor(annotation = requestmapping.class) string[] consumes() default {}; /** * requestmapping#produces的别名 */ @aliasfor(annotation = requestmapping.class) string[] produces() default {}; }
其他变体如下:
@getmapping、@putmapping、@patchmapping和@deletemapping,与@postmapping实现类似
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。