Spring HTTP Status 400 - 客户端发送的请求在语法上不正确(添加日期输入时)

标签 spring jsp http spring-mvc http-status-code-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;

部分任务 Controller

@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";
}

知道这是什么吗?

提前致谢!


关于错误的新的额外信息 我添加了一些验证注释并获得了有关错误的新信息。

Field error in object 'task' on field 'date': rejected value [01/01/2001]; codes [typeMismatch.task.date,typeMismatch.date,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [task.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @org.springframework.format.annotation.DateTimeFormat java.util.Date for value '01/01/2001'; nested exception is java.lang.IllegalArgumentException: Unable to parse '01/01/2001']

最佳答案

有两个问题:

  • 1 参数(idTaskCategory、idTaskPriority、idXXX)与Task 字段不匹配。 (这不是你的问题的原因,但它不会起作用。当你更改名称以使它们匹配时,问题是你的请求包含 id,但你的 Task 期望对象。所以你需要让任务也期望 id,或者你需要注册一些转换器)

  • 2(我认为这是问题所在),我预计日期格式/转换器不接受提交的日期格式。将 @DateTimeFormat(pattern = "yyyy-MM-dd") 添加到所有日期字段。

<罢工> 我认为一个问题可能是您使用了 http 方法 GET。 GET 请求使用 URL 查询字符串(? 之后的内容)发送参数。 但 URL 的总长度受浏览器、搜索引擎、网络服务器的技术限制。 因此,问题的一个原因可能是 URL 变长,如果您有很多参数或“长”值(例如长描述)。 (这是正确的,但不是原因)

所以我建议改用 http 方法 POST。 -- 并且使用 POST 是一个更好的动词,用于更改服务器上的某些内容的请求 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)。

关于Spring HTTP Status 400 - 客户端发送的请求在语法上不正确(添加日期输入时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21929232/

相关文章:

java - jsp mysql插入错误

http - 如何测试 http 请求处理程序

javascript - 未收到 node.js POST 回调

c - 删除 TCP、IP 和以太网 header 后,从数据包中获取 HTTP header

java - Swagger 与 MapStruct 抛出 org.springframework.context.annotation.ConflictingBeanDefinitionException

javascript - 从 JSP 转到 Servlet,然后返回同一个 JSP,字段为空

java - 无法打到Servlet页面

java - HikariCP - 使用 HikariDataSource 的链接错误

java - Spring-@Repository 和 @RepositoryRestResource 的区别和用例?

json - Jackson JSON 序列化 - 指定递归级别