Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让Spring@RestController接受JSON格式而不是www格式的参数?_Javascript_Java_Json_Spring Mvc_Spring Restcontroller - Fatal编程技术网

Javascript 如何让Spring@RestController接受JSON格式而不是www格式的参数?

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

在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发送帖子时,一切正常,我看到日志中打印的值“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
语义


您似乎误解了请求参数所代表的含义。它要么是查询参数,要么是表单参数。在第二个示例中,您没有发送任何一个。非常感谢您的书面回答。这教会了我需要了解什么才能正确地完成它。