有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java可以在@RequestMapping之后调用@ModelAttribute吗?

我有一个这样的控制器:

@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();
    }
}

简而言之,我的观点会在几乎所有的动作中呈现user, 但我不想编码:

model.addAttribute("user", LoadCurrentUserFromDataBase())

相反,在每一个动作中,我都在寻找一种像@ModelAttribute这样的方式来向我所有的观点公开user

然而,根据文档,在同一个控制器中,在@RequestMapping方法之前调用控制器中的@ModelAttribute方法

至于我的代码,getUserupdate之前被调用,但我想得到更新的用户

有没有一种方法可以在操作之后公开user属性,而不在每个操作中显式调用model.addAttribute


共 (2) 个答案

  1. # 1 楼答案

    每次执行POST时,都要进行重定向。这样,您的POST方法将只负责更新数据,更新后的数据将由目标控制器加载

    因此在这种情况下,update()方法将重定向到另一个控制器,该控制器将在其GET方法之前调用getUser()方法

  2. # 2 楼答案

    如果Post/redirect/GET解决方案对您有效,那么它就是有效的

    然而,我有一个类似的情况,在请求处理(主要是跟踪信息)之后,我的所有控制器都需要编写模型属性。我所做的是注册一个自定义接口(例如^{),我将其应用于所有需要提供额外数据的控制器。接口将有如下方法:

    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