Spring MVC ModelAttribute作为接口

时间:2016-02-02 22:12:24

标签: java spring web-services spring-mvc controller

使用Spring MVC @Controller,我如何让@RequestMapping端点将@ModelAttribute声明为接口?

我希望将三种不同的表单发布到映射中,基础类都是接口类型。

例如,我可以有三个不同的表单对象,其操作如下:

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

(其中ObjectInterface是一个接口,而不是具体的类。)

2 个答案:

答案 0 :(得分:0)

想出来。它是编写和注册自定义HandlerMethodArgumentResolver。以下是核心代码。您只需要确定要传递到webDataBinderFactory的具体bean类。然后可以编写您的控制器以接受接口,并为您提供接口后面的具体实现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();
    }
}

答案 1 :(得分:0)

可以使用请求级别模型属性完成,如下所示:

假设有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中的数据将添加到最终的Model中。