【发布时间】:2016-06-01 23:33:37
【问题描述】:
第 1 步: Ajax 请求:
$.ajax({
url: "url",
type: "POST",
dataType: 'json',
data:{
'id': '1',
'type': 'BOOK_VIEWED',
'access_token': response.response.access_token
},
crossDomain: true,
success: function() { }
});
STEP 2. 在执行 Spring Controller 方法之前从请求中获取参数;这里有两种变体:
-
变体 1: 如果我发送标头中带有
content-type: json的 ajax 请求,这将不起作用;否则它将:
String token = request.getParameter(HEADER_SECURITY_TOKEN);
-
变体 2: 如果我在标题中设置
content-type: json,这将起作用:
StringBuilder sb = new StringBuilder();
BufferedReader reader = request.getReader();
String line;
while ((line = reader.readLine()) != null)
sb.append(line).append('\n');
步骤 3. 应该执行 Spring Controller bookOpened 方法:
@RequestMapping(value = "/event",
method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE)
public void bookOpened(@RequestBody PostEvent postEvent, HttpServletRequest request) {
// ..
}
当试图运行时,bookOpened 方法没有被执行并且一个415(unsupported media type) Exception 被抛出。如果将方法签名更改为仅接受:HttpServletRequest request 参数(没有@RequestBody 参数),它将起作用;但这对我来说不是一个可行的解决方案。
主要问题:
- 在第 2 步中,我想从请求中获取一个参数。
- 在第 3 步中,我想包含
@RequestBody参数,而不仅仅是HttpServletRequest参数。
【问题讨论】:
-
您的项目中是否包含依赖项:
jackson-core和jackson-databin? -
那么你将如何获得 before 控制器的参数?用拦截器,还是其他方式?
标签: java json ajax spring spring-mvc