繁体   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