#java #spring #session #spring-mvc #modelattribute
#java #spring #сессия #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";
}
...
...
}
}
Что я хочу знать, так это то, необходима ли эта проверка. Команда является атрибутом сеанса и создается с использованием метода заполнения контроллера, когда это необходимо. Таким образом, команда никогда не может быть нулевой, пока сеанс активен.
Чего я не знаю, так это того, что происходит, когда сеанс истекает. Создает ли контроллер атрибут model снова? Если это так, то объект command никогда не может быть нулевым независимо от состояния сеанса.
Спасибо за любую помощь.
Комментарии:
1. Я полагаю, что если
@ModelAttribute
запрос поступает из сеанса, и у вас нет@ModelAttribute
метода для созданияMyCommand
, и время ожидания вашего сеанса истекло, то это было бы возможноnull
. Но это простой тест, который можно увидеть. Откройте свое приложение, доберитесь до сути прямо перед тем, как нажать на этот обработчик, и оставьте его, скажем, на час или на что у вас установлен тайм-аут сеанса. Продолжите и посмотрите, получите ли вы там null (возможно, захотите поместить туда SOP, чтобы вы знали, что это было null).
Ответ №1:
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
пакете artefact org.springframework.web.method.annotation
и spring-webmvc
артефакте в пакете org.springframework.web.servlet.mvc.method.annotation
.
Ответ №2:
На самом деле у вас может быть следующее:
@ModelAttribute("isNull")
public T returnNull() {
return null;
}
@RequestMapping("/")
public String go(@ModelAttribute("isNull") T isNull) {
return isNull ? "isNull" : "isNotNull";
}
и isNotNull
будет возвращено представление.