【问题标题】:Spring MVC URI returns 404 for an ajax POST requestSpring MVC URI 为 ajax POST 请求返回 404
【发布时间】:2014-11-24 04:19:24
【问题描述】:

我正在尝试使用 json 数组向 spring 控制器发出 HTTP POST 请求。我收到 404 响应。我已经完成了以下教程:

但无论我尝试什么,我总是得到同样的错误。我正在为我的项目使用 Spring v3.0.5。

"NetworkError: 404 Not Found -
http://127.0.0.1:8080/projectmvc/arttestresults/addsearchqueries"

我的 jQuery 代码如下:

$.ajax({
    url: '/projectmvc/arttestresults/addsearchqueries',
    type: 'POST'
    context: document.body,
    dataType: 'json',
    data: {'searchQueries': JSON.stringify([{'appName': 'myAppName', 'searchQuery': 'query # 1'}]}
}).done(function(data) {
    var dataObject;
    try {
        dataObject = jQuery.parseJSON(data);
    } catch (err) {
        dataObject = data;
    }
    // HTML escape.
    // See https://github.com/janl/mustache.js/blob/master/mustache.js#L52
    var entityMap = {
        "&": "&",
        "<": "&lt;",
        ">": "&gt;",
        '"': '&quot;',
        "'": '&#39;',
        "/": '&#x2F;'
    };

    var escapeHtml = function(input) {
        return String(input).replace(/[&<>"'\/]/g, function (s) {
            return entityMap[s];
        });
    };

    // Messages
    $('#message').text('Success');

 }).fail(function(jqXhr, textStatus, errorThrown) {
    $('#message').text('Error');
});

我的控制器代码:

@RequestMapping(method=RequestMethod.POST, value="/arttestresults/addsearchquery")
@ResponseStatus(HttpStatus.OK)
public void  addSearchQuery(HttpServletRequest request) {
  String searchQueryString = request.getParameter("searchQueries");
  Gson gson = new Gson();
  Type collectionType = new TypeToken<List<ArtSearchQueryRequest>>(){}.getType();
  List<ArtSearchQueryRequest> searchQueries =
       gson.fromJson(searchQueryString,    collectionType);
  // Insert the search queries
}

渲染 JSP 的控制器函数

  @RequestMapping(method=RequestMethod.GET, value="/arttestresults/showaddsearchqueryform.html")
  public String showAddSearchQuery(Model model) {
    ArtSearchQueryRequest request = new ArtSearchQueryRequest();
    request.setAppName(APPNAME);
    model.addAttribute("searchQueryRequest", request);
   return "addsearchqueries";
  }

JSP 页面

<!DOCTYPE html>
<html>
 . . . 
</head>
<body>
<div class="container">
  <div id="message" class="units-2 column" style="left:50%; top: 5%; position:fixed">
  </div>
  <div class="column-group">
      <div class="units-2 column">
        <h4>Add Search Queries</h4>
      </div>
  </div>
  <!-- Add the form inside this. -->
  <div class="column-group">
      <div class="units-2 column">
        <form modelAttribute="searchQueryRequest" method="POST"
         action="${pageContext.request.contextPath}/arttestresults/addsearchquery">
        <div class="form-group">
      <label for="appNameHidden" class="hide">App Name</label>
      <form:hidden path="appName" id="appNameHidden" htmlEscape="true"></form:hidden>
    </div>
          <div class="form-group">
            <label for="searchQuery">Search Query</label>
            <input type="text" maxlength="100"name="searchQuery"
             placeholder="Enter your search query here.">
             <span><a href="#">Add more queries.</a></span>
          </div>
          <button class="button" type="button">Submit</button>
        </form>
      </div>
  </div>
</div>
 <%@ include file="/WEB-INF/views/scripts.jsp" %>
 <script type="text/javascript">
    $('form button').on('click.submit.queries', function(event) {
      event.preventDefault();
      $('form input[type=text]').makeSearchCall({
         url: '${pageContext.request.contextPath}/arttestresults/addsearchqueries',
         type: 'POST',
         appName: 'crawler'
      })
    });
 </script>
</body>
</html>

请求永远不会到达控制器。

UPDATE日志如下:

POST http://localhost:8080/projectmvc/arttestresults/addsearchquery 404 Not Found 5ms
NetworkError: 404 Not Found - http://localhost:8080/projectmvc/arttestresults/addsearchquery"

我尝试使用请求正文进行请求映射,如下所示

@RequestMapping(method=RequestMethod.POST, value=arttestresults/addsearchquery)
@ResponseStatus(HttpStatus.OK)
public void  addSearchQuery(@RequestBody final String requestBodyString) {
  String searchQueryString = request.getParameter("searchQueries");
  Gson gson = new Gson();
  Type collectionType = new TypeToken<List<ArtSearchQueryRequest>>(){}.getType();
  List<ArtSearchQueryRequest> searchQueries =
       gson.fromJson(searchQueryString,    collectionType);
  // Insert the search queries
}

更新 #2 Http Fox Post Request 返回以下内容

data: "[{"appName":"crawler","searchQuery":"test1"},{"appName":"crawler","searchQuery":"test2"},{"appName":"crawler","searchQuery":"test3"},{"appName":"crawler","searchQuery":"test4"}]" 

【问题讨论】:

  • 您的控制器是否有类级别的@RequestMapping("/projectmvc/**") 注释?如果不是,那么您对“/projectmvc/arttestresults/addsearchquery”的请求将永远不会起作用,因为您的方法级别@RequestMapping(method=RequestMethod.POST, value="/arttestresults/addsearchquery") 不包含/projectmvc/ 路径。
  • 我需要这样做吗?我从来不需要为其他不使用 jQuery Ajax 的控制器定义 webapp 上下文
  • 尝试不使用该路径的 POST 请求,它仍然返回 404 吗?
  • 是的。确实如此。我不知道为什么。
  • 这是您的实际代码吗? @RequestBody 拼写错误,映射中的值应该用引号括起来,并且应该是 /arttestresults 之前...应用程序甚至不应该启动...

标签: jquery ajax json spring spring-mvc


【解决方案1】:

在解决 404 错误时,我通常遵循以下步骤:

  1. 使用浏览器调试器查看请求中发送的请求和数据
  2. 如果请求和数据符合我的预期,我会检查服务器日志。通常它会让你知道发生了什么。通常是以下之一:

    • 应用程序启动时出错,导致映射未加载
    • web.xml 中的 servlet 映射不正确
    • 注释未启用或配置不正确
    • 控制器中的映射不正确。要查看映射,请为 Spring 日志记录打开 DEBUG 模式 - 它会在应用程序启动时记录所有映射
    • Spring 在请求处理和验证期间抛出异常。

    其中大部分很容易从日志中收集到。为了避免遇到控制器映射问题,我使用Spring MockMVC 对控制器进行单元测试——这样调试问题要容易得多。

    如果一切都失败了,我打开调试器看看到底发生了什么。

【讨论】:

    【解决方案2】:

    您在 AJAX 请求中发送的数据是一个对象数组。但是 @RequestBody 映射到一个字符串 - 不确定这是否正确。

    我看到 json 映射层中抛出的异常被包装为 404 错误。找出实际异常的最好方法是添加相关的spring源(我认为spring web和webmvc应该足够了),添加一些断点和调试。

    【讨论】:

      【解决方案3】:

      @RequestMapping(value = "/something", headers = "Accept=application/json", method = RequestMethod.POST)

      【讨论】:

        【解决方案4】:

        如果您的项目中使用了 spring security,那么您应该在您的 ajax 请求中添加 csrf 令牌。 This answer 包含详细信息。

        【讨论】:

        • 请您了解相关问题的详细信息,并针对用户提出问题所面临的问题提出解决方案。
        猜你喜欢
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 2016-11-28
        • 1970-01-01
        • 2020-03-16
        • 2015-05-06
        • 1970-01-01
        • 2012-08-10
        相关资源
        最近更新 更多