Spring MVC URI为ajax POST请求返回404

时间:2014-09-29 17:31:54

标签: jquery ajax json spring spring-mvc

我正在尝试向带有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>

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

更新日志如下:

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"}]" 

4 个答案:

答案 0 :(得分:0)

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

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

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

    大多数这些都很容易从日志中收集。为避免遇到控制器映射问题,我使用Spring MockMVC进行控制器的单元测试 - 以这种方式调试问题要容易得多。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

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