Java Spring MVC能否在@RequestMapping之后调用@ModelAttribute?
我有一个这样的控制器:Java Spring MVC能否在@RequestMapping之后调用@ModelAttribute?,java,spring,spring-mvc,modelattribute,Java,Spring,Spring Mvc,Modelattribute,我有一个这样的控制器: @Controller public class HomeController { @RequestMapping(value = "/update", method = RequestMethod.POST) public String update(@RequestParam("user") User user, ModelMap model){ SaveUserToDatabase(user); return "in
@Controller
public class HomeController {
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String update(@RequestParam("user") User user, ModelMap model){
SaveUserToDatabase(user);
return "index";
}
@ModelAttribute("user")
String getUser() {
return LoadCurrentUserFromDataBase();
}
}
void provideAdditionalData(Model model, HttpServletRequest request);
简而言之,我的视图将在HomeController
中的几乎每个操作中呈现user
,
但我不想编码:
model.addAttribute("user", LoadCurrentUserFromDataBase())
相反,在每一个动作中,我都在寻找一种类似于@modeldattribute
的方法来向我的所有视图公开user
但是,根据文档,控制器中的@modeldattribute
方法在同一控制器中的@RequestMapping
方法之前被调用
至于我的代码,getUser
在update
之前被调用,但我想获取更新的用户
有没有一种方法可以在每个操作中不显式调用
model.addAttribute
而在操作后公开用户属性。这样,您的POST
方法将只负责更新数据,更新后的数据将由目标控制器加载
因此,在这种情况下,update()
方法将重定向到另一个控制器,该控制器将在其GET
方法之前调用getUser()
方法。如果Post/redirect/GET解决方案对您有效,则它是有效的
然而,我有一个类似的情况,在请求处理(主要是跟踪信息)之后,我的所有控制器都需要编写模型属性。我所做的是注册一个自定义接口(例如,AdditionalModelDataSupplier
),我将其应用于所有需要提供附加数据的控制器。接口将具有如下方法:
@Controller
public class HomeController {
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String update(@RequestParam("user") User user, ModelMap model){
SaveUserToDatabase(user);
return "index";
}
@ModelAttribute("user")
String getUser() {
return LoadCurrentUserFromDataBase();
}
}
void provideAdditionalData(Model model, HttpServletRequest request);
现在,我编写了一个拦截器,它在postHandle
方法中检查该接口的控制器bean并调用该方法:
@Override
public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler,
final ModelAndView modelAndView) throws Exception {
AdditionalModelDataSupplier modelDataSupplier = findAdditionalModelDataSupplier(handler);
if (modelDataSupplier != null) {
final ModelMap modelMap = modelAndView.getModelMap();
final Model targetModel;
if (modelMap instanceof Model) {
targetModel = (Model) modelMap;
} else {
// the modelmap doesn't implement model, so we need to provide a wrapper view
targetModel = new ForwardingModel(modelMap);
}
modelDataSupplier.provideAdditionalData(targetModel, request);
}
}
@Nullable
private static AdditionalModelDataSupplier findAdditionalModelDataSupplier(final Object handler) {
if (handler instanceof AdditionalModelDataSupplier) {
return (AdditionalModelDataSupplier) handler;
}
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Object bean = handlerMethod.getBean();
if (bean instanceof AdditionalModelDataSupplier) {
return (AdditionalModelDataSupplier) bean;
}
}
return null;
}
(上面提到的ForwardingModel
类创建起来很简单,它只是将所有内容委托给ModelMap
)