与Spring MVC abstract class binding类似,我有一个带有@ModelAttribute参数的处理程序方法,这是一个接口。根据传入请求的一些属性,我想以编程方式选择一个实例来实例化,然后使用Spring在其内部编组的任何内容将其绑定到请求主体,以便编组到对象中。
这是否可行,我需要使用哪些Spring组件来实现它?
答案 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
方法确保此解析程序仅解析类型为CustomInterface
和resolveArgument
方法的方法,解决参数的实际机制。
实现此类后,将其添加到当前参数解析器列表中。例如,在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, ...) {
....
}
}