我是春天的新手。我生成如下的JSON:
[
{
"customer" : "16", "project" : "19",
"phase" : "47", "approver" : "5",
"date1" : "", "date2" : "",
"date3" : "", "date4" : "",
"date5" : "", "date6" : "",
"date7" : "", "activity" : "1"
},
{
"customer" : "17", "project" : "20",
"phase" : "48", "approver" : "3",
"date1" : "", "date2" : "",
"date3" : "", "date4" : "",
"date5" : "", "date6" : "",
"date7" : "", "activity" : "1"
}
]
我将这个JSON传递给我的Spring控制器:
$.ajax({
type: 'post',
url: 'NewTimesheet',
dataType : 'json',
data: JSON.stringify(jsonObj),
success: function(data) {
console.log(data);
}
});
我将请求映射到控制器,如下所示:
@RequestMapping(value="NewTimesheet", headers = { "Content-type=application/json" })
@ResponseBody
public String addNewTimesheet(@RequestBody List<Timesheet> timesheet,
HttpSession session) {
logger.info("timesheet list size is" + timesheet.size());
return "success";
}
Timesheet
上课:
public class Timesheet {
private String project;
private String phase;
private String approver;
private String customer;
private String date1;
private String date2;
private String date3;
private String date4;
private String date5;
private String date6;
private String date7;
private String activity;
//Getters and setters
}
但我的请求未与控制器映射。我的控制台显示如下:
WARN org.springframework.web.servlet.PageNotFound.handleNoSuchRequestHandlingMethod:142 - 找不到servlet请求的匹配处理程序方法:path'/ NewTimesheet',方法'POST',参数 地图['[{ “顾客”: “16”, “项目”: “19”, “相”: “47”, “批准”: “5”, “日期1”: “”, “日期2”: “” “DATE3”: “”, “date4”: “”, “date5”: “”, “date6”: “”, “date7”: “”, “活性”: “1”},{ “客户”: “17”, “项目”: “20”, “相”: “48”, “批准”: “3”, “日期1”: “”, “日期2”: “”, “DATE3”: “”,” date4 “:””, “date5”: “”, “date6”: “”, “date7”: “”, “活性”: “1”}]” - &GT;阵列[ '']]
如何将我的JSON映射到控制器?任何帮助将不胜感激!!!
答案 0 :(得分:3)
您需要将类注释为Controller,在类中添加RequestMapping,在方法中添加调用的HTTP方法。
@Controller
@RequestMapping("/NewTimesheet")
public class MyClassName {
@RequestMapping(value={ "", "/" }, method = RequestMethod.POST, headers = { "Content-type=application/json" })
@ResponseBody
public String addNewTimesheet(@RequestBody List<Timesheet> timesheet,HttpSession session){
logger.info("timesheet list size is"+timesheet.size());
return "success";
}
}
答案 1 :(得分:2)
在控制器中的列表之前将@RequestBody更改为@ModelAttribute。在你的json中,放入&#39;时间表。&#39;在每个字段之前,即timesheet.customer,timesheet.project ....就像那样。那会有用。
答案 2 :(得分:2)
可能会给您带来问题的一些事情:
确保您拥有杰克逊的所有必要依赖项。对于Maven,这将是:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.2</version>
</dependency>
您不需要对JavaScript对象进行字符串化,这是隐式完成的。您还应该为提交的变量命名,因为它必须映射到域对象:
$.ajax({
method : 'post',
url : 'NewTimesheet',
dataType : 'json',
data:{ 'timesheet': jsonObj },
success : function(data) {
console.log(data);
}
});
您的控制器应配置为显式处理POST请求。不需要在标题中设置接受的内容类型。此外,我认为您需要将域对象映射到数组而不是列表:
@RequestMapping(value="NewTimesheet", method = RequestMethod.POST)
public @ResponseBody String addNewTimesheet(@RequestParam("timesheet") Timesheet[] timesheet,HttpSession session){
logger.info("timesheet list size is"+timesheet.length);
return "success";
}
如果您使用的是相对较新版本的Spring MVC,则无需处理请求和生成JSON所需的其他配置。您的AJAX请求指定了一个JSON响应,Spring将识别并委托给Jackson来序列化输入和输出。
答案 3 :(得分:2)
您需要定义method=post
。我还添加了produces = "application/json"
@RequestMapping(value="NewTimesheet", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public String addNewTimesheet(@RequestBody List<Timesheet> timesheet,HttpSession session){
logger.info("timesheet list size is"+timesheet.size());
return "success";
}
答案 4 :(得分:1)
在我的ajax请求中,我添加了contentType:application / json.After添加此控制器映射了我的ajax请求。感谢所有人。