【问题标题】:Unsupported Media Type Error in AJAX-SpringAJAX-Spring 中不支持的媒体类型错误
【发布时间】:2014-02-06 15:21:45
【问题描述】:

我正在尝试使用 jquery-ajax 将 POST 数据从我的 jsp 传递到我的 Spring-MVC 控制器函数。数据传递良好,当我使用 String 对象接收 RequestBody 时,我可以打印 JSON 数据。 但是当我使用一个 DTO 时,它有一个用自己的对象声明的 List 变量,控制器返回一个 '415 Unsupported Media Type Error' 并带有以下语句,

服务器拒绝此请求,因为请求实体的格式不受所请求方法的请求资源支持。

下面给出的是 DTO 类

    public class anyClassDTO{
          private String name;
          private List<anyClassDTO> subList = new ArrayList<anyClassDTO>();

              //getters and setters here
   }

现在,这里是控制器功能

@RequestMapping(headers ={"Accept=application/json"}, value = "urlFromJsp", method = RequestMethod.POST)
public @ResponseBody
String addData (HttpServletRequest request,
               @RequestBody List<anyClassDTO> dtoObject,    
               Model model)
{       
    return "{\"value\":\"true\"}";
}

难道不能通过 AJAX 从 jsp 页面接收对象列表到控制器吗?

这是一组从jsp传递过来的样本数据

[{"name":"module1","subList":[{"name":"chapter1","subList":[{"name":"subchapter1","subList":null}]}] },{"name":"module2","subList":[{"name":"chapter1","subList":[{"name":"subchapter1","subList":null}]}]}]

【问题讨论】:

  • 对于我认为您遇到的问题,这是一个奇怪的错误。如果你给我们你正在使用的 Spring 版本可能会有所帮助。
  • spring 版本是 3.1,Jackson Mapper 库是 2.3.0
  • @SotiriosDelimanolis 你能告诉我你认为我有什么“那个”问题吗?

标签: json spring jquery spring-json


【解决方案1】:

确保您的 AJAX 请求将请求的 Content-Type 设置为 application/json

当您指定@RequestBody 时,Spring 通常使用MappingJacksonHttpMessageConverter 来转换请求正文。这个HttpMessageConverter只支持application/*+json类型的内容类型,所以你必须确保你的请求包含它。

【讨论】:

  • 在 AJAX 调用中,我们已经设置了以下 beforeSend : function(xhr) { xhr.setRequestHeader("Accept", "application/json"); xhr.setRequestHeader("Content-Type", "application/json"); }
  • @evyavan 编辑您的帖子并添加您的 AJAX。我用你的代码试过了,它可以工作。您不需要中间 DTO。您还可以将您的记录器设置为调试以查看 Spring 错误的位置。
【解决方案2】:

好吧,我们可以通过添加更多细节使其按原样工作。我没有将@ResponseBody 作为 List 对象接收,而是创建了另一个 DTO,它包含原始 DTO 的 List 对象。所以第二个 DTO 基本上是一个虚拟对象,它从 AJAX 接收数据作为单个对象。

就像我在问题中所说的,我有一个如下的 DTO

 public class AnyClassDTO{
      private String name;
      private List<anyClassDTO> subList = new ArrayList<anyClassDTO>();

          //getters and setters here

}

我创建了另一个 DTO,其中包含上述 DTO 的列表

public class DummyDTO{
      private List<AnyClassDTO> dummyObj;

      //getters and setters here
}

然后在控制器中我将功能更改为

@RequestMapping(headers ={"Accept=application/json"}, value = "urlFromJsp", method =  RequestMethod.POST)
public @ResponseBody
String addData (HttpServletRequest request,
           @RequestBody DummyDTO dummyDTOObj,    
           Model model)
{       
        return "{\"value\":\"true\"}";
}

之前,如果我直接从 AJAX 发送列表,现在我发送带有保存整个数据的变量的字符串化文字。

它就像一个魅力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 2016-09-10
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2014-11-11
    相关资源
    最近更新 更多