Как читать атрибуты flash после перенаправления в Spring MVC 3.1?
Я хотел бы знать, как читать атрибуты flash после перенаправления в Spring MVC 3.1.
У меня есть следующий код:
@Controller
@RequestMapping("/foo")
public class FooController {
@RequestMapping(value = "/bar", method = RequestMethod.GET)
public ModelAndView handleGet(...) {
// I want to see my flash attributes here!
}
@RequestMapping(value = "/bar", method = RequestMethod.POST)
public ModelAndView handlePost(RedirectAttributes redirectAttrs) {
redirectAttrs.addFlashAttributes("some", "thing");
return new ModelAndView().setViewName("redirect:/foo/bar");
}
}
Что мне не хватает?
Ответы
Ответ 1
Используйте Model
, у него должны быть предварительно настроенные flash-атрибуты:
@RequestMapping(value = "/bar", method = RequestMethod.GET)
public ModelAndView handleGet(Model model) {
String some = (String) model.asMap().get("some");
// do the job
}
или, альтернативно, вы можете использовать RequestContextUtils#getInputFlashMap
:
@RequestMapping(value = "/bar", method = RequestMethod.GET)
public ModelAndView handleGet(HttpServletRequest request) {
Map<String, ?> inputFlashMap = RequestContextUtils.getInputFlashMap(request);
if (inputFlashMap != null) {
String some = (String) inputFlashMap.get("some");
// do the job
}
}
P.S. Вы можете вернуть return new ModelAndView("redirect:/foo/bar");
в handlePost
.
ИЗМЕНИТЬ
JavaDoc говорит:
Модель RedirectAttributes пуста при вызове метода и никогда не используется, если метод не возвращает имя вида перенаправления или RedirectView.
Он не упоминает ModelAndView
, поэтому, возможно, измените handlePost, чтобы вернуть строку "redirect:/foo/bar"
или RedirectView
:
@RequestMapping(value = "/bar", method = RequestMethod.POST)
public RedirectView handlePost(RedirectAttributes redirectAttrs) {
redirectAttrs.addFlashAttributes("some", "thing");
return new RedirectView("/foo/bar", true);
}
Я использую RedirectAttributes
в своем коде с помощью метода RedirectView
и model.asMap()
, и он работает нормально.
Ответ 2
Попробуйте следующее:
@Controller
public class FooController
{
@RequestMapping(value = "/foo")
public String handleFoo(RedirectAttributes redirectAttrs)
{
redirectAttrs.addFlashAttribute("some", "thing");
return "redirect:/bar";
}
@RequestMapping(value = "/bar")
public void handleBar(@ModelAttribute("some") String some)
{
System.out.println("some=" + some);
}
}
работает в Spring MVC 3.2.2
Ответ 3
Для всех подобных мне, у кого были проблемы с просмотром URL-адреса POST в браузере, когда проверка не удалась.
URL-адрес POST - это частный URL-адрес, который не должен подвергаться воздействию пользователей, но он автоматически отображается при неудачной проверке. т.е. если поле было ниже минимальной длины. Я использовал @Valid. Я хотел, чтобы исходный GET url формы отображался всегда, даже когда валидация вернулась к форме, поэтому я сделал следующее:
if (validation.hasErrors()) {
redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.story", validation);
redirectAttributes.addFlashAttribute("story", story);
return new ModelAndView("redirect:/january/2015");
где story - это представление объекта формы, redirectAttributes - это атрибуты RedirectAttributes, которые вы помещаете в подпись метода, а проверка является BindingResult./январь/2015 - это сопоставление с контроллером GET, где находится форма.
После этой реализации, в отображении для/январь/2015, история не имеет значения следующим образом:
Story story= (Story) model.asMap().get("story");
//story from the POST method
Мне пришлось увеличить мой метод GET и проверить, не было ли это нулевым. Если не null, то отправьте это в форму else. Я бы отправил вновь инициализированный тип Story в форму по умолчанию.
Таким образом, я могу вернуться к форме с неизменными связями (ошибки отображаются в форме), но вместо моего почтового URL-адреса должен быть URL-адрес GET.