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' в требуемый тип 'java.util.Date' для свойства '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 ']


person Joe    schedule 21.02.2014    source источник
comment
в классе pojo, если для поля даты я использую - import java.sql.Date, я получал такое же исключение выше. В pojo мы должны использовать - import java.util.Date   -  person Anurag_BEHS    schedule 16.10.2017


Ответы (2)


Есть два зонда:

  • 1 параметры (idTaskCategory, idTaskPriority, idXXX) не соответствуют полям Task. (это не причина вашей проблемы, но это просто не сработает. И когда вы измените имена так, чтобы они совпадали, проблема в том, что ваш запрос содержит идентификаторы, но ваши Task ожидаемые объекты. Поэтому вам нужно сделать задачу ожидайте тоже идентификаторы, или вам нужно зарегистрировать какой-нибудь конвертер)

  • 2 (я думаю, что это проблема), я ожидаю, что формат / конвертер даты не принимает представленный формат даты. Добавьте @DateTimeFormat(pattern = "yyyy-MM-dd") во все поля даты.

Я думаю, одна проблема может заключаться в том, что вы используете метод http GET. Запрос GET отправляет параметр, используя строку запроса URL (материал после ?). Но общая длина URL-адреса технически ограничена браузерами, чачами, веб-серверами. Таким образом, одна из причин проблемы может заключаться в том, что URL-адрес становится слишком длинным, если у вас много параметров или «длинное» значение (например, длинное описание). (это правильно, но не причина)

Поэтому я бы рекомендовал вместо этого использовать http метод POST. - А использование POST - лучший глагол для запроса, который что-то меняет на сервере (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html).

person Ralph    schedule 21.02.2014
comment
Спасибо за совет. Я это уже знаю, но, к сожалению, проблема не в этом. Я использую GET, чтобы увидеть строку запроса. Я буду использовать POST, когда узнаю, как решить проблему. - person Joe; 21.02.2014
comment
@Joe: Вы правы, я пропустил пример опубликованного запроса. - Но я думаю, что сейчас заметил пробу. - person Ralph; 21.02.2014
comment
Проблема 1, я мог быть ошибкой, но если я возьму дату ввода из jsp, контроллер получит объект Task, но с нулевой датой, на данный момент это нормально. Проблема 2, я пробовал с этой проверкой и без нее, и даже с другим типом проверки, например dd / mm / yyyy ... и все равно возникает та же проблема :( - person Joe; 21.02.2014
comment
У меня появилась новая информация, которую я добавил в вопрос, может быть, это нам чем-то поможет - person Joe; 21.02.2014
comment
вы были правы, он работал с @DateTimeFormat (pattern = dd / MM / yyyy). Может заглавная ММ;) - person Joe; 21.02.2014
comment
Что касается проблемы 1, у меня есть свойство класса вместо идентификатора для некоторых свойств, но я получаю идентификатор из формы. Стоит ли менять свойства для id в классе? - person Joe; 21.02.2014
comment
Я уже решил это. Спасибо за помощь, @Ralph! - person Joe; 21.02.2014
comment
@Joe: Взгляните на этот вопрос: stackoverflow.com/questions/5593581/ - (Где-то должен быть другой вопрос и ответ, где я объяснял, как это сделать с помощью конвертера, но я не могу его найти. Возможно, у вас есть больше удачи) - person Ralph; 21.02.2014

Давным-давно я тоже столкнулся с этой проблемой.

Я решил это, используя:

@InitBinder

protected void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    binder.registerCustomEditor(Date.class, new CustomDateEditor(
            dateFormat, false));
}
person Prakash Gaikwad    schedule 16.12.2015