我正试图用jquery ajax将POST数据从我的jsp传递到我的Spring MVC控制器函数。数据传递良好,当我使用String对象接收RequestBody时,我可以打印JSON数据但是,当我使用一个DTO,它有一个用自己的对象声明的List变量时,控制器返回一个">415不支持的媒体类型错误",并带有以下语句,
服务器拒绝了此请求,因为请求实体的格式不受请求方法的请求资源支持。
下面给出的是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":[{
确保AJAX请求将请求的Content-Type
设置为application/json
。
当您指定@RequestBody
时,Spring通常使用MappingJacksonHttpMessageConverter
来转换请求体。这个HttpMessageConverter
只支持application/*+json
类型的内容类型,所以你必须确保你的请求包含它
好吧,我们可以通过添加更多的细节使其正常工作。我没有将@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发送列表,现在我发送一个字符串化的垃圾文件,其中包含一个保存整个数据的变量。
它就像一个符咒!