Javascript 如何让Spring@RestController接受JSON格式而不是www格式的参数?
在JDK 1.8上使用Spring 4.1.7,我有一个@RestController类,如下所示:Javascript 如何让Spring@RestController接受JSON格式而不是www格式的参数?,javascript,java,json,spring-mvc,spring-restcontroller,Javascript,Java,Json,Spring Mvc,Spring Restcontroller,在JDK 1.8上使用Spring 4.1.7,我有一个@RestController类,如下所示: @RestController public class ServiceAController { public static final Logger LOG = Logger.getLogger(ServiceAController.class); @RequestMapping(value="/rest/servicea", method=RequestMethod.P
@RestController
public class ServiceAController {
public static final Logger LOG = Logger.getLogger(ServiceAController.class);
@RequestMapping(value="/rest/servicea", method=RequestMethod.POST)
public ServiceAResponse serviceA(@RequestParam(value="parmA", defaultValue="defaultParmA") String parmA,
@RequestParam(value="parmB", defaultValue="defaultParmB") String parmB,
@RequestParam(value="parmC", defaultValue="defaulParmC") String parmC) {
LOG.info("Inside Service A handler: " + parmA + " B: "+ parmB + " C: "+ parmC);
}
当我从这样的javascript向/rest/servicea发送帖子时,一切正常,我看到日志中打印的值“a”、“b”和“c”:
var data = {
"parmA": "a",
"parmB": "b",
"parmC": "c"
}
$.ajax({
type: "POST",
url: "./rest/servicea",
contentType: "application/x-www-form-urlencoded",
data: data,
dataType: "json",
success: submitAuthSuccess,
error: submitAuthFailure
})
var data = {
"parmA": "a",
"parmB": "b",
"parmC": "c"
}
$.ajax({
type: "POST",
url: "./rest/servicea",
contentType: "application/json",
data: JSON.stringify(data),
dataType: "json",
success: submitAuthSuccess,
error: submitAuthFailure
})
但是,当我尝试将调用从javascript更改为此(将协议更改为REST而不是www urlencode)时,我会在日志中获得默认值(defaultParmA、defaultParmB、defaultParmC):
var data = {
"parmA": "a",
"parmB": "b",
"parmC": "c"
}
$.ajax({
type: "POST",
url: "./rest/servicea",
contentType: "application/x-www-form-urlencoded",
data: data,
dataType: "json",
success: submitAuthSuccess,
error: submitAuthFailure
})
var data = {
"parmA": "a",
"parmB": "b",
"parmC": "c"
}
$.ajax({
type: "POST",
url: "./rest/servicea",
contentType: "application/json",
data: JSON.stringify(data),
dataType: "json",
success: submitAuthSuccess,
error: submitAuthFailure
})
我认为@RestController类中缺少了一些东西,无法让它解析JSON,而不需要www URL编码的数据
我尝试在serviceA
方法上更改@RequestMapping
注释以添加consumes=“application/json”
属性,但没有效果
使用JSON而不是POST正文中的urlencoded数据,我能做些什么来实现这一点呢?在我看来,此时传递的是一个JSON对象,而不是一组参数,因此Spring无法将发送的内容与您提供的任何参数相匹配 试一试
@RequestBody列表单元
javadoc状态不是@RequestParam
指示方法参数应绑定到的注释
web请求参数
这是通过请求参数的各种ServletRequest
方法检索的。例如,哪个国家
请求参数是随请求发送的额外信息。对于
HTTP servlet,参数包含在查询字符串中或已发布
表单数据
在第二个代码段中,您也没有发送。您正在请求正文中发送JSON
Spring有一种机制(它有许多机制,还有自定义机制)用于将其反序列化到您期望的数据中。标准解决方案是,假设您有一个适当注册的HttpMessageConverter
,可以处理JSON。如果类路径上有Jackson 2,Spring会自动注册,这样可以正确地将JSON反序列化为Java POJO类型
提供了许多示例,并解释了如何使用它。使用JSON,您可以使用与您发送的字段相对应的字段定义POJO类型
class RequestPojo {
private String paramA;
private String paramB;
private String paramC;
// and corresponding getters and setters
}
并将此类型的@RequestBody
注释参数添加到处理程序方法中
public ServiceAResponse serviceA(@RequestBody RequestPojo pojo) {
pojo.getParamB(); // do something
return ...;
}
Jackson允许您通过注释或配置ObjectMapper
,定义如何处理缺少的值
@RestController
在此不涉及。正如javadoc所说
携带此注释的类型被视为控制器,其中
@RequestMapping
方法默认采用@ResponseBody
语义
您似乎误解了请求参数所代表的含义。它要么是查询参数,要么是表单参数。在第二个示例中,您没有发送任何一个。非常感谢您的书面回答。这教会了我需要了解什么才能正确地完成它。