Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC能否在@RequestMapping之后调用@ModelAttribute?_Java_Spring_Spring Mvc_Modelattribute - Fatal编程技术网

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