Spring控制器400错误请求和application / x-www-form-urlencod v / s application / json

时间:2016-03-31 00:40:45

标签: java spring spring-mvc mime-types

我有以下Spring控制器映射:

YES

如果我按下面的方式调用它,那么我得到400响应。

@RequestMapping(value="/isSomethingHappening", method = RequestMethod.POST)
public @ResponseBody JsonResponse isSomethingHappening(HttpServletRequest httpRequest,@RequestParam("employeeId") String employeeId, 
        ModelMap model) throws IOException{

但是如果我按照下面的方式调用它,那么我会得到成功的回复。

var requestData = {"employeeId":XYZ.application.employeeId};

            XYZ.network.fireAjaxRequestAsync("application/json", "forms/testing/isSomethingHappening", requestData, function(response, status, xhr){

我想到了修复但我无法理解为什么当我的请求数据对象var requestData = {"employeeId":XYZ.application.employeeId}; XYZ.network.fireAjaxRequestAsync("application/x-www-form-urlencoded", "forms/testing/isSomethingHappening", requestData, function(response, status, xhr){ 保持不变并且我刚刚更改了内容类型时,第一个给了我错误。 对我var requestData = {"employeeId":XYZ.application.employeeId};看起来更合适的内容类型,因为我的请求数据是JSON对象。

<小时/> 另外,我还有其他实例,我的控制器映射如下:

application/json

为了调用它,我发送请求如下:

@RequestMapping(value = "/getOnFlyResults", method = RequestMethod.POST)
    public @ResponseBody JsonResponse getOnFlyResults(HttpServletRequest httpRequest, 
            @RequestBody testingRequestVO testingRequestVO, ModelMap modelMap) throws IOException{

我不明白为什么我必须使用var requestData = {"employeeId":XYZ.application.employeeId, "fName":XYZ.application.fName, "lName": XYZ.application.lName, "telephoneNumber":telephoneNumber, "testMode":XYZ.constant.onFly}; XYZ.network.fireAjaxRequestAsync("application/json", "forms/testing/startTest", JSON.stringify(requestData), function(response, status, xhr){ 对数据进行字符串化,如果我不这样做,那么我将得到400.

一旦我进行了字符串化,那么它就变成了一个字符串,那么我的内容类型应该是JSON.stringify(requestData),但它适用于text/plain

请注意我知道代码修复,但我想了解这个概念。我已经阅读了this,并没有详细解释我的概念和查询。

1 个答案:

答案 0 :(得分:1)

在Spring应用程序中使用Jackson库来处理JSON是很常见的。 如果您使用的是Ant,请尝试将Jackson添加到您的库中。

您可以直接从Maven Central下载Jackson图书馆。这是一个示例Maven依赖块(但获取最新版本):

<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-mapper-asl</artifactId>
  <version>1.9.13</version>
</dependency>

确保Spring配置中有注释驱动标记:

<annotation-driven />

无论有没有Jackson,它也可能有助于指定控制器端点生成或使用JSON;

@RequestMapping(value="/getjson", 
    produces=MediaType.APPLICATION_JSON_VALUE, consumes=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody MyObject getJSON(){
    return new MyObject();
}