springboot中PostMapping正常接收json参数后返回404问题

2022-07-15,,,,

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实现类似 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

《springboot中PostMapping正常接收json参数后返回404问题.doc》

下载本文的Word格式文档,以方便收藏与打印。