- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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
:
调用 RequestContextUtils#getOutputFlashMap
访问 flash map 并更新它们(属性 + 目标重定向)
调用方便的方法RequestContextUtils#saveOutputFlashMap
您可以获得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/
我是一名优秀的程序员,十分优秀!