Spring MVC и тимелеаф ModelAttribute имеют значение null или не оцениваются

Я разрабатываю веб-приложение с Spring MVC и Thymeleaf в качестве моего ViewResolver. У меня есть следующий метод обработчика контроллера:

    @RequestMapping(value = "/something", method = RequestMethod.POST, params = "submit")
    public String doSomething(@ModelAttribute("error") String error /*, other attributes */) {
        // find out if there is an error 
        error = getErrorMessage();

        return "someHTMLfile";
    }

Мое представление содержит эту строку:

<p><span th:text="${error}">Error Message goes here</span></p>

При выполнении тег ни во что не преобразуется. Вероятно, это связано с тем, что ${error} оценивает пустую строку, но я не могу понять, почему. Разве аннотация Spring @ModelAttribute не добавляет объект на карту модели автоматически, где Thymeleaf может его найти?

Если вместо этого у меня есть:

@RequestMapping(value = "/something", method = RequestMethod.POST, params = "submit")
public String doSomething(ModelMap map /*, other attributes */) {
    // find out if there is an error 
    String error;
    error = getErrorMessage();
    map.addAttribute("error", error);

    return "someHTMLfile";
}

Представление отображается отлично с сообщением об ошибке. Разве @ModelAttribute не добавляет объект в модель запроса?

Изменить: я пытался сделать и то, и другое:

@RequestMapping(value = "/something", method = RequestMethod.POST, params = "submit")
public String doSomething(@ModelAttribute("error") String error, ModelMap map /*, other attributes */) {
    // find out if there is an error 
    error = getErrorMessage();
    map.addAttribute("error", error);

    return "someHTMLfile";
}

Это тоже не работает.


person Sotirios Delimanolis    schedule 06.01.2013    source источник


Ответы (2)


На самом деле я не думаю, что ваша проблема связана с Thymeleaf, просто со SpringMVC :-)

В вашем первом фрагменте вы ничего не добавляете к модели запроса, но пытаетесь вернуть объект с именем «ошибка» из формы.

Во втором фрагменте вы добавляете объект в модель, поэтому ваше представление хорошо отображается.

Взгляните на Документ SpringMVC здесь (16.3.3.8), чтобы лучше понять аннотацию @ModelAttribute в аргументе метода.

person tduchateau    schedule 06.01.2013
comment
Оказывается, мы оба ошибаемся, ModelAttribute действительно делает то, что я думал. Мне стыдно сказать, что это проблема Java. Смотрите мой ответ. - person Sotirios Delimanolis; 07.01.2013

Я чувствую себя глупо, но что бы там ни было, мы все делаем ошибки.

Spring создавал для меня новый экземпляр String и внедрял его в мой метод и в модель под ключом error. Строка — это неизменяемый объект, поэтому, когда я делаю error = getErrorMessage(), я назначаю другой экземпляр моему объекту error. Теперь есть моя error и ошибка String в модели Spring со значением "". Вот почему рендеринг Thymeleaf находит только пустую строку.

person Sotirios Delimanolis    schedule 06.01.2013