Spring MVC-绑定处理程序方法参数,用于在运行时选择的类型

时间:2016-01-13 02:52:44

标签: java spring spring-mvc

Spring MVC abstract class binding类似,我有一个带有@ModelAttribute参数的处理程序方法,这是一个接口。根据传入请求的一些属性,我想以编程方式选择一个实例来实例化,然后使用Spring在其内部编组的任何内容将其绑定到请求主体,以便编组到对象中。

这是否可行,我需要使用哪些Spring组件来实现它?

1 个答案:

答案 0 :(得分:0)

您可以实施HandlerMethodArgumentResolver来解析自定义方法参数。假设您的界面是CustomInterface,那么:

public class CustomInterfaceResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().isAssignableFrom(CustomInterface.class);
    }


    @Override
    public CustomInterface resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // instantiate CustomInterface impls based on request parameters
        // and return it of course
    }
}

supportsParameter方法确保此解析程序仅解析类型为CustomInterfaceresolveArgument方法的方法,解决参数的实际机制。

实现此类后,将其添加到当前参数解析器列表中。例如,在java config中:

public class WebConfig extends WebMvcAutoConfigurationAdapter {
    ...
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(customArgumentResolver);
    }
    ...
}

之后,每次向控制器方法参数添加CustomInterface时,都会调用CustomInterfaceResolver#resolveArgument来解析参数:

@RestController
@RequestMapping("/somewhere")
public class CustomInterfaceController {
    @RequestMapping
    public ResponseEntity doSomething(CustomInterface ci, ...) {
        ....
    }
}