在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.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发送POST到/ 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
})
但是,当我尝试将调用从javascript更改为此(将协议更改为REST而不是www-urlencode)时,我在日志中得到了默认值(defaultParmA,defaultParmB,defaultParmC):
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-urlencoded数据。
我尝试更改方法@RequestMapping
上的注释serviceA
以添加consumes="application/json"
属性,但这没有任何效果。
使用POST正文中的JSON而不是urlencoded数据,我可以做些什么更改以使其起作用?
该@RequestParam
javadoc的状态
指示方法参数应绑定到Web请求参数的注释。
可通过各种ServletRequest
方法获取请求参数。例如,ServletRequest#getParameterMap()
哪个州
请求参数是与请求一起发送的额外信息。对于HTTP Servlet,参数包含在查询字符串或发布的表单数据中。
在第二个片段中,您都不发送任何一个。您正在请求正文中发送JSON。
Spring有一种机制(有很多和自定义的),可以将其反序列化为所需的数据。标准解决方案是@RequestBody
,前提是您已经注册HttpMessageConverter
了可以处理JSON的适当名称。MappingJackson2HttpMessageConverter
如果您在类路径上具有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
默认情况下采用语义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句