[英]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.