【问题标题】:404 not found error in jQuery AJAX call to Spring controller在对 Spring 控制器的 jQuery AJAX 调用中找不到 404 错误
【发布时间】:2015-01-01 14:25:44
【问题描述】:

我是春天的新手。我生成如下 JSON:

[
    {
        "customer" : "16", "project" : "19",
        "phase" : "47", "approver" : "5",
        "date1" : "", "date2" : "",
        "date3" : "", "date4" : "",
        "date5" : "", "date6" : "",
        "date7" : "", "activity" : "1"
    },

    {
        "customer" : "17", "project" : "20",
        "phase" : "48", "approver" : "3",
        "date1" : "", "date2" : "",
        "date3" : "", "date4" : "",
        "date5" : "", "date6" : "",
        "date7" : "", "activity" : "1"
    }
]

我将此 JSON 传递给我的 Spring 控制器:

$.ajax({
    type: 'post',
    url: 'NewTimesheet',
    dataType : 'json',
    data: JSON.stringify(jsonObj),

    success: function(data) {
        console.log(data);
    }
});

我将请求映射到控制器,如下所示:

@RequestMapping(value="NewTimesheet", headers = { "Content-type=application/json" })
@ResponseBody
public String addNewTimesheet(@RequestBody List<Timesheet> timesheet,
    HttpSession session) {

    logger.info("timesheet list size is" + timesheet.size());
    return "success";
}

Timesheet类:

public class Timesheet {
    private String project;
    private String phase;
    private String approver;
    private String customer;
    private String date1;
    private String date2;
    private String date3;
    private String date4;
    private String date5;
    private String date6;
    private String date7;
    private String activity;

    //Getters and setters
}

但是我的请求没有映射到控制器。我的控制台显示如下:

警告 org.springframework.web.servlet.PageNotFound.handleNoSuchRequestHandlingMethod:142 - 没有为 servlet 请求找到匹配的处理程序方法:路径“/NewTimesheet”、方法“POST”、参数 地图['[{"客户":"16","项目":"19","阶段":"47","审批人":"5","date1":"","date2":"" ,"date3":"","date4":"","date5":"","date6":"","date7":"","activity":"1"},{"customer": "17","project":"20","phase":"48","approver":"3","date1":"","date2":"","date3":""," date4":"","date5":"","date6":"","date7":"","activity":"1"}]' -> 数组['']]

如何将我的 JSON 映射到控制器?任何帮助将不胜感激!!!

【问题讨论】:

  • 您是否在项目中包含了所有必要的 Jackson 依赖项(核心和数据绑定)?

标签: java jquery ajax json spring


【解决方案1】:

您需要将类注释为Controller,在您的类中添加一个RequestMapping,并在您的方法中添加您调用的HTTP方法。

@Controller
@RequestMapping("/NewTimesheet")
public class MyClassName {

        @RequestMapping(value={ "", "/" }, method = RequestMethod.POST, headers = { "Content-type=application/json" })
        @ResponseBody
        public String addNewTimesheet(@RequestBody List<Timesheet> timesheet,HttpSession session){
                 logger.info("timesheet list size is"+timesheet.size());
                 return "success";
        }
}

【讨论】:

  • 这对我不起作用。我将注释放在班级级别
  • 您是否也添加了 method = RequestMethod.POST ?它是否给出相同的错误?
【解决方案2】:

将控制器中列表之前的@RequestBody 更改为@ModelAttribute。在您的 json 中,输入“时间表”。在每个字段之前,即 timesheet.customer,timesheet.project.... 之类的。那会起作用的。

【讨论】:

    【解决方案3】:

    您需要定义method=post。我还添加了produces = "application/json"

    @RequestMapping(value="NewTimesheet", method = RequestMethod.POST, produces = "application/json")
            @ResponseBody
            public String addNewTimesheet(@RequestBody List<Timesheet> timesheet,HttpSession session){
                     logger.info("timesheet list size is"+timesheet.size());
                     return "success";
            }
    

    【讨论】:

      【解决方案4】:

      可能会给您带来问题的几件事:

      1. 确保您拥有 Jackson 的所有必要依赖项。对于 Maven,这将是:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.2.2</version>
        </dependency>
        
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.2.2</version>
        </dependency>    
        
      2. 您不需要对 JavaScript 对象进行字符串化,这是隐式完成的。您还应该命名您提交的变量,因为它必须映射到域对象:

        $.ajax({
            method : 'post',
            url : 'NewTimesheet',
            dataType : 'json',
            data:{ 'timesheet': jsonObj },
            success : function(data) {
                console.log(data);
        
            }
        });
        
      3. 您的控制器应配置为显式处理 POST 请求。不需要在标题中设置接受的内容类型。另外,我相信您需要将域对象映射到数组而不是列表:

        @RequestMapping(value="NewTimesheet", method = RequestMethod.POST)
        public @ResponseBody String addNewTimesheet(@RequestParam("timesheet") Timesheet[] timesheet,HttpSession session){
                 logger.info("timesheet list size is"+timesheet.length);
                 return "success";
        }
        

      如果您使用的是相对较新的 Spring MVC 版本,则不需要额外的配置来处理请求和生成 JSON。您的 AJAX 请求指定一个 JSON 响应,Spring 将识别该响应并将其委托给 Jackson 以序列化输入和输出。

      【讨论】:

        【解决方案5】:

        在我的 ajax 请求中,我添加了 contentType:application/json。添加此控制器后映射了我的 ajax 请求。谢谢大家。

        【讨论】:

          猜你喜欢
          • 2016-02-01
          • 1970-01-01
          • 2020-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-28
          • 1970-01-01
          相关资源
          最近更新 更多