Подтвердить что ты не робот

Как читать атрибуты 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");
  }

}

Что мне не хватает?

4b9b3361

Ответ 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.