gpt4 book ai didi

java - 如何在签名中没有 RedirectAttributes 的方法中访问 RedirectAttributes?

转载 作者:行者123 更新时间:2023-12-04 15:34:25 27 4
gpt4 key购买 nike

在 Spring Boot Controller 中,是否可以在其签名中没有 RedirectAttributes 的方法中访问 RedirectAttributes?换句话说,它可以作为“bean”或上下文变量从框架中访问吗?

我这样做的动机是能够重构几个请求映射方法(la Clean Code)以将异常处理移出这些方法。因此,例如,我有几个方法使用 catch block ,如下所示:

    @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 的指针,而类中的每个方法都不必拥有它在它的签名中并通过注入(inject)传递它?

最佳答案

你有几种方法来处理 RequestContextUtils :

  1. 调用 RequestContextUtils#getOutputFlashMap 访问 flash map 并更新它们(属性 + 目标重定向)

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

  3. 您可以获得FlashMapManager

    的实例

调用此方法写入flash属性:

Save the given FlashMap, in some underlying storage and set the start of its expiration period. NOTE: Invoke this method prior to a redirect in order to allow saving the FlashMap in the HTTP session or in a response cookie before the response is committed.

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

关于java - 如何在签名中没有 RedirectAttributes 的方法中访问 RedirectAttributes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60194924/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com