目录
  • PostMapping接收json参数后返回404
    • 问题描述
    • 解决
  • @PostMapping注解解析

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

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

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。