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 {
@AliasFor(annotation = RequestMapping.class)
String name() default "";
@AliasFor(annotation = RequestMapping.class)
String[] value() default {};
@AliasFor(annotation = RequestMapping.class)
String[] path() default {};
@AliasFor(annotation = RequestMapping.class)
String[] params() default {};
@AliasFor(annotation = RequestMapping.class)
String[] headers() default {};
@AliasFor(annotation = RequestMapping.class)
String[] consumes() default {};
@AliasFor(annotation = RequestMapping.class)
String[] produces() default {};
}
其他变体如下:
@GetMapping、@PutMapping、@PatchMapping和@DeleteMapping,与@PostMapping实现类似
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。