我正在尝试使用jquery-ajax将jsp中的POST数据传递给我的Spring-MVC控制器函数。数据传递正常,当我使用String对象接收 RequestBody 时,我可以打印JSON数据。 但是当我使用具有使用自己的对象声明的List变量的DTO 时,控制器使用以下语句返回“ 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传递的一组样本数据
[{ “名称”: “模块1”, “子列表”:[{ “名称”: “第1章”, “子列表”:[{ “名称”: “subchapter1”, “子列表”:空}]}] },{ “名称”: “模块2”, “子列表”:[{ “名称”: “第1章”, “子列表”:[{ “名称”: “subchapter1”, “子列表”:空}]}]}]
答案 0 :(得分:1)
确保您的AJAX请求将请求的Content-Type
设置为application/json
。
当您指定MappingJacksonHttpMessageConverter
时,Spring通常会使用@RequestBody
来转换请求正文。此HttpMessageConverter
仅支持application/*+json
类型的内容类型,因此您必须确保您的请求包含它。
答案 1 :(得分:0)
好吧,我们可以通过添加更多细节来使其工作。我没有接收@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发送一个列表,那么现在我发送一个带有变量的字符串化文本,该变量保存整个数据。
它就像一个魅力!