【发布时间】:2014-11-24 04:19:24
【问题描述】:
我正在尝试使用 json 数组向 spring 控制器发出 HTTP POST 请求。我收到 404 响应。我已经完成了以下教程:
- SpringMVC Ajax validation
- Parsing JSON in Spring MVC using Jackson JSON
- Passing in JSON array to spring MVC Controller
- Passing JSON Array from javascript to spring mvc controller
- JQuery, Spring MVC @RequestBody and JSON - making it work together
- http://spring.io/blog/2012/08/29/integrating-spring-mvc-with-jquery-for-validation-rules/
- http://spring.io/blog/2010/01/25/ajax-simplifications-in-spring-3-0/
但无论我尝试什么,我总是得到同样的错误。我正在为我的项目使用 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 = {
"&": "&",
"<": "<",
">": ">",
'"': '"',
"'": ''',
"/": '/'
};
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