繁体   English   中英

如何获取Spring @RestController以JSON格式而不是www-form-urlencoded接受参数?

[英]How can I get a Spring @RestController to accept parameters in JSON format rather than www-form-urlencoded?

在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向/ rest / servicea发送POST时,一切正常,并且我在日志中看到了值“ 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数据。

我尝试更改serviceA方法上的@RequestMapping批注以添加consumes="application/json"属性,但这没有任何效果。

使用JSON而不是POST正文中的经过urlencoded的数据,我可以做些什么更改以使其起作用?

@RequestParam javadoc状态

指示方法参数应绑定到Web请求参数的注释。

可通过各种ServletRequest方法获取请求参数。 例如, ServletRequest#getParameterMap()指出

请求参数是与请求一起发送的额外信息。 对于HTTP Servlet,参数包含在查询字符串或发布的表单数据中。

在第二个片段中,您都不发送任何一个。 您正在请求正文中发送JSON。

Spring有一种机制(有很多和自定义的),可以将其反序列化为所需的数据。 标准解决方案是@RequestBody ,假设您具有可以正确处理JSON的适当注册的HttpMessageConverter 如果您在类路径上具有Jackson 2,Spring会自动注册MappingJackson2HttpMessageConverter ,它可以正确地将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语义。

在我看来,您此时正在传递单个JSON对象,而不是一组参数,因此Spring无法将您发送的内容与您提供的任何参数进行匹配。

尝试

@RequestBody List<ListUnit> listOfUnits

而不是@RequestParam

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM