Spring HTTP Status 400-客户端发送的请求在语法上不正确(添加日期输入时)
问题内容:
当我在jsp表单上添加日期字段时,出现此错误,但是如果没有它,它将很好地工作。
请求
http://localhost:8080/myTasks/docreatetask?task=hi+there&description=stucked+here&date=2014-02-21&idTaskCategory=1&idTaskPriority=1&idTaskState=1&pending=1&idUser=0&idUser_responsible=0&evaluation=aaaaaa
部分form.jsp
<form method="GET"
action="${pageContext.request.contextPath}/docreatetask">
<table>
<tr>
<td>Task</td>
<td><input name="task" type="text" /></td>
</tr>
<tr>
<td>Description</td>
<td><textarea name="description"></textarea></td>
</tr>
<tr>
<td>Date</td>
<td><input name="date" type="date"/></td>
</tr>
部分 Task.java 组件
@Component("task")
public class Task {
private long id;
private String task;
private String description;
private Date date;
private Date deadline;
private Category category;
private Priority priority;
private State state;
private User user;
private User userResponsible;
private String evaluation;
private Date timestamp;
private int pending;
部分 任务控制器
@RequestMapping("/createtask")
public String createTask(Model model) {
List<Category> categories = taskService.getCategories();
List<Priority> priorities = taskService.getPriorities();
List<State> states = taskService.getStates();
List<User> users = taskService.getUsers();
model.addAttribute("categories",categories);
model.addAttribute("priorities",priorities);
model.addAttribute("states",states);
model.addAttribute("users",users);
return "createtask";
}
@RequestMapping(value="/docreatetask", method=RequestMethod.GET)
public String doCreateTask(Model model, Task task) {
System.out.println(">TaskController doCreateTask " + task);
return "taskcreated";
}
知道这可能是什么吗?
提前致谢!
有关该错误的新的额外信息, 我添加了一些验证批注,并且获得了有关该错误的新信息。
字段“日期”上对象“任务”中的字段错误:拒绝的值[01/01/2001];代码[typeMismatch.task.date,typeMismatch.date,typeMismatch.java.util.Date,typeMismatch];参数[org.springframework.context.support.DefaultMessageSourceResolvable:代码[task.date,date];
参数[];
默认消息[日期]];默认消息[未能将类型’java.lang.String’的属性值转换为属性’date’的必需类型’java.util.Date’;嵌套的异常是org.springframework.core.convert.ConversionFailedException:无法从类型java.lang.String转换为@
org.springframework.format.annotation.DateTimeFormat类型java.util.Date的值‘01 /
01/2001’;嵌套的异常为java.lang.IllegalArgumentException:无法解析“ 01/01/2001”]
问题答案:
有两个探针:
-
1参数(idTaskCategory,idTaskPriority,idXXX)与
Task
字段不匹配。(这不是导致问题的原因,但是它根本无法正常工作。当您更改名称以使其匹配时,问题是您的请求包含id,但您的Task
期望对象。因此,您需要使任务成为期望也是ID,或者您需要注册一些转换器) -
2(我认为这是问题所在),我希望 日期格式/转换器不接受提交的日期格式 。添加
@DateTimeFormat(pattern = "yyyy-MM-dd")
到所有日期字段。
我认为一个问题可能是您使用了http方法( 这是正确的,但不是原因 )GET
。GET请求使用URL查询字符串(后面的内容?
)发送参数。但是,URL的总长度在技术上受到浏览器,chach和Web服务器的限制。因此,导致此问题的原因可能是,如果您有很多参数或“长”值(例如长说明),则URL会变长。
因此,我建议改用http方法POST
。-并且使用POST
更好的动词来改变服务器上的请求(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)。