【问题标题】:Spring controller 400 bad request and application/x-www-form-urlencod v/s application/jsonSpring 控制器 400 错误请求和 application/x-www-form-urlencod v/s application/json
【发布时间】:2016-07-19 05:58:18
【问题描述】:

我有以下 Spring 控制器映射:

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

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

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}; 保持不变并且我只是更改了内容类型时,我无法理解为什么第一个给我错误。 对我来说,application/json 看起来更适合内容类型,因为我的请求数据是 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){

我不明白为什么我必须使用JSON.stringify(requestData) 对数据进行字符串化,如果我不这样做,我将得到 400。

一旦我字符串化然后它变成一个字符串然后我的内容类型应该是text/plain 但它适用于application/json

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

【问题讨论】:

  • 您是否已将 jackson 库配置为您的应用程序的依赖项?
  • 使用 Maven?摇篮?

标签: java spring spring-mvc mime-types


【解决方案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();
}

【讨论】:

  • 感谢好友的回复。我说我解决了与这一切相关的所有问题,我对概念更感兴趣。
  • 如果您对概念感兴趣,我强烈建议您看看 Spring Boot。如果您查看入门页面,您会发现使用 REST Web 服务启动和运行是多么容易:projects.spring.io/spring-boot
  • 这将解释如何在 Spring 中做事,它不会解释我正在寻找的概念。
猜你喜欢
  • 1970-01-01
  • 2018-06-04
  • 2017-09-11
  • 2019-12-12
  • 2014-03-30
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多