Как я могу получить доступ к RedirectAttributes в методе без RedirectAttributes в его подписи? - PullRequest
2 голосов
/ 12 февраля 2020

В контроллере Spring Boot возможно ли получить доступ к RedirectAttributes в методе без RedirectAttributes в его подписи? Другими словами, можно ли получить к нему доступ из фреймворка как «bean» или контекстную переменную?

Моя мотивация для этого состоит в том, чтобы иметь возможность реорганизовать несколько методов отображения запросов (например, Чистый код *) 1006 *) убрать обработку исключений из этих методов. Так, например, у меня есть несколько методов с блоком catch, например:

    @GetMapping("/security/user/{uid}")
    public String showEditUserForm(@PathVariable("uid") String uid, Model model, RedirectAttributes redirectAttributes) {
        try {
            model.addAttribute("userAccount", userAccountService.findByUsername(uid));
            return "/security/edituser";
        } catch(UserDoesntExistException e) {
            redirectAttributes.addFlashAttribute("flashstatus","danger");
            redirectAttributes.addFlashAttribute("flashmessage","User doesn't exist");
            return "redirect:/security";
        }
    }

Вместо этого я хотел бы сделать что-то вроде этого:

    @GetMapping("/security/user/{uid}")
    public String showEditUserForm(@PathVariable("uid") String uid, Model model) {
        try {
            model.addAttribute("userAccount", userAccountService.findByUsername(uid));
            return "/security/edituser";
        } catch(UserDoesntExistException e) {
            return redirectWithMessage("danger","User doesn't exist");
        }
    }

    // and several other mappings that also call redirectWithMessage()

    public String redirectWithMessage(String status, String message) {
        // obtain RedirectAttributes somehow!
        redirectAttributes.addFlashAttribute("flashstatus",status);
        redirectAttributes.addFlashAttribute("flashmessage",message);
        return "redirect:/security";
    }

Таким образом, вопрос в том, как вспомогательный метод ("redirectWithMessage") может получить указатель на RedirectAttributes, при этом каждый метод в классе не должен иметь его в своей сигнатуре и передать его посредством инъекции?

1 Ответ

1 голос
/ 06 марта 2020

У вас есть несколько способов с RequestContextUtils:

  1. Позвоните RequestContextUtils#getOutputFlashMap, чтобы получить доступ к карте fla sh и обновить их ( атрибуты + перенаправление цели)

  2. Вызов удобного метода RequestContextUtils#saveOutputFlashMap

  3. Вы можете получить экземпляр FlashMapManager

Вызовите этот метод для записи атрибутов fla sh:

Сохраните данный FlashMap в некотором базовом хранилище и установите начало его срока действия. ПРИМЕЧАНИЕ. Вызовите этот метод перед перенаправлением, чтобы разрешить сохранение FlashMap в сеансе HTTP или в процессе подготовки ответа ie до его подтверждения.

void saveOutputFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response)

Вы можете получить доступ на текущий запрос / ответ @Autowire их в bean-компонент.

Для вашего варианта использования придерживайтесь # 1 - все в порядке (просто добавьте атрибуты, местоположение перенаправления уже установлено в вашей возвращаемой строке)

Пример:

@Autowired
HttpServletRequest request;

public String redirectWithMessage(String status, String message) {
   FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);

   flashMap.put("flashstatus",status);
   flashMap.put("flashmessage",message);

   return "redirect:/security";
}
...