Spring MVC: нужно ли проверять, является ли @ModelAttribute нулевым?

Я работаю над проектом Spring 3 и всегда проверяю, является ли @ModelAttribute нулевым, если это так, я перенаправляю пользователя на страницу с ошибкой.

@Controller
@SessionAttributes({"myCommand"})
public class MyController {
  @ModelAttribute("myCommand")
  public MyCommand populate(HttpServletRequest request) {
    return new MyCommand();
  }
  @RequestMapping(value="/user/saveFoo", method=RequestMethod.POST)
  public String saveFoo(HttpServletRequest request, @ModelAttribute("myCommand") MyCommand myCommand) {
    if(myCommand == null) {
      // Add invalid session error here.
      return "error.htm";
    }
    ...
    ...
  }
}

Я хочу знать, нужна ли эта проверка. Команда является атрибутом сеанса и при необходимости создается с использованием метода заполнения контроллера. Таким образом, команда никогда не может быть нулевой, пока сеанс жив.

Чего я не знаю, так это того, что происходит, когда сеанс истекает. Контроллер снова создает атрибут модели? Если это так, то объект команды никогда не может быть нулевым независимо от состояния сеанса.

Спасибо за любую помощь.


person Bahattin Ungormus    schedule 04.07.2014    source источник
comment
Я считаю, что если @ModelAttribute исходит из сеанса, и у вас не будет метода @ModelAttribute для создания MyCommand, а время вашего сеанса истекло, тогда он может быть null. Но это легко увидеть. Откройте свое приложение, перейдите к сути прямо перед тем, как вы нажмете этот обработчик, и оставьте его, скажем, на час или на то, на что вы установили тайм-аут сеанса. Продолжайте и посмотрите, получите ли вы там нуль (возможно, вы захотите поместить туда SOP, чтобы вы знали, что он был нулевым).   -  person CodeChimp    schedule 04.07.2014


Ответы (2)


Spring MVC создает для всех параметров метода новый экземпляр, что сводит к минимуму потенциальный риск исключения нулевого указателя в ваших методах контроллера! Но будьте осторожны, это не относится к типам-оболочкам и классам с пользовательскими HandlerMethodArgumentResolver, который может возвращать null в качестве возвращаемого значения.

Чтобы ответить на ваш вопрос, Spring MVC создает новый экземпляр класса вашей модели, даже если срок действия сеанса истек. Он никогда не может быть нулевым!

Цитата из ModelAttributeMethodProcessor javadoc:

Атрибуты модели получаются из модели или, если они не найдены, возможно, создаются с помощью конструктора по умолчанию, если он доступен.

Если конструктор по умолчанию недоступен, Spring MVC выдает исключение BeanInstantiationException

org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [entity.Product]: No default constructor found

Вы можете безопасно удалить все проверки нулевого указателя.

Для обзора того, что Spring MVC может обрабатывать в методах контроллера по умолчанию, вы должны взглянуть на код и javadoc в spring-web пакете артефактов org.springframework.web.method.annotation и spring-webmvc артефакт в пакете org.springframework.web.servlet.mvc.method.annotation.

person ksokol    schedule 05.07.2014

На самом деле у вас может быть следующее:

@ModelAttribute("isNull")
public T returnNull() {
    return null;
}

@RequestMapping("/")
public String go(@ModelAttribute("isNull") T isNull) {
    return isNull ? "isNull" : "isNotNull";
}

и будет возвращено представление isNotNull.

person Adrian Ber    schedule 01.04.2015