簡體   English   中英

Spring MVC ModelAttribute作為接口

[英]Spring MVC ModelAttribute as Interface

使用Spring MVC @Controller,我如何讓@RequestMapping端點具有@ModelAttribute聲明為接口?

我想將三種不同的形式發布到映射,這些映射表明基礎類都是接口類型。

因此,例如,我可以擁有三個不同的表單對象,並具有以下作用:

@RequestMapping(path="/doSomething", method=RequestMethod.POST)
public String doSomething(ObjectInterface formInfo) {
   ...
}

(其中ObjectInterface是接口,而不是具體的類。)

弄清楚了。 它是編寫和注冊自定義HandlerMethodArgumentResolver的方法。 以下是核心代碼。 您只需要確定將哪個具體的bean類傳遞到webDataBinderFactory中即可。 然后可以編寫您的控制器以接受接口,並且將在接口后面為您提供具體的實現Bean。

public class MessageResolverTest implements HandlerMethodArgumentResolver {

    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType().equals(<Interface>.class);
    }

    public Object resolveArgument(MethodParameter methodParameter,
                                  ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest,
                                  WebDataBinderFactory webDataBinderFactory) throws Exception {

        String name = ModelFactory.getNameForParameter(methodParameter);
        WebDataBinder webDataBinder = webDataBinderFactory.createBinder(nativeWebRequest, new <ConcreteBean>(), name);
        MutablePropertyValues mutablePropertyValues = new MutablePropertyValues(nativeWebRequest.getParameterMap());
        webDataBinder.bind(mutablePropertyValues);

        return webDataBinder.getBindingResult().getTarget();
    }
}

可以使用請求級別模型屬性來完成此操作,如下所示:

假設有一個ObjectInterace接口,它具有三個實現類,分別為ObjectA,ObjectB和ObjectC。 那么Controller方法的聲明為:

@RequestMapping(path="/doSomething", method=RequestMethod.POST)
public String doSomething(@ModelAttribute("object") ObjectInterface formInfo) {
   ...
}

添加方法以在控制器類中填充modelattribute:

    @ModelAttribute("object")
    public ObjectInterface getModelObject(HttpServletRequest request) {
     ObjectInterface object = null;
     String type = request.getParameter("type");
      if (StringUtils.equals("A", type)) {
        object= new objectA();
      } else if (StringUtils.equals("B", type)){
        object= new objectB();
      }else if (StringUtils.equals("C", type)){
        object= new objectC();
       }else{
          //object=any default object.
       }
     return object ;
   }

getModelObject返回的值將添加到Model中,並將使用從視圖到控制器方法的值填充該值。

在調用處理程序方法之前,Spring會調用所有具有@ModelAttribute批注的方法。 它將這些方法返回的數據添加到臨時Map對象。 執行處理程序方法后,此Map中的數據將添加到最終模型中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM