簡體   English   中英

如何在簽名中沒有 RedirectAttributes 的方法中訪問 RedirectAttributes?

[英]How can I access RedirectAttributes in a method without RedirectAttributes in its signature?

在 Spring Boot 控制器中,是否可以在簽名中沒有RedirectAttributes的方法中訪問RedirectAttributes 換句話說,它可以作為“bean”或上下文變量從框架中訪問嗎?

我這樣做的動機是能夠重構幾個請求映射方法(à la Clean Code )以將異常處理移出這些方法。 因此,例如,我有幾個帶有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的指針,而類中的每個方法都必須在其簽名中包含它並通過注入傳遞它?

您有幾種使用RequestContextUtils的方法:

  1. 調用RequestContextUtils#getOutputFlashMap來訪問 flash map 並更新它們(屬性 + 目標重定向)

  2. 調用方便的方法RequestContextUtils#saveOutputFlashMap

  3. 您可以獲得FlashMapManager實例

調用此方法寫入 flash 屬性:

將給定的 FlashMap 保存在一些底層存儲中,並設置其到期時間的開始。 注意:在重定向之前調用此方法,以允許在提交響應之前將 FlashMap 保存在 HTTP 會話或響應 cookie 中。

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";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM