假设我的Controller
中有以下方法:
@RequestMapping(method = {RequestMethod.GET}, value = "")
@ResponseBody
public Object getObject(@MyAnnotation String value) {
log.debug(value) //value is populated
...
}
我如何将请求中的内容绑定到此注释值? Spring是否为绑定过程提供了任何钩子?如果有人能指出我正确的方向,那就太棒了。
谢谢!
答案 0 :(得分:5)
是的,你可以。
Spring使用HandlerMethodArgumentResolver
(您可以在javadoc的All Known Implementing Classes
区域中看到默认值)来决定将哪些内容传递给控制器方法。
您可以创建并注册自己的HandlerMethodArgumentResolver
来查找注释。
public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(MyAnnotation.class) != null;
}
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
// do something about it
}
}
Spring遍历List<HandlerMethodArgumentResolver>
个注册的解析器(默认情况下,某些自定义注册),调用supportsParameter()
。它使用它找到的第一个支持相关参数的文件。
要注册程序化配置,您可以扩展WebMvcConfigurationSupport
并覆盖其方法
@Configuration
public class DispatcherContext extends WebMvcConfigurationSupport {
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new MyHandlerMethodArgumentResolver());
}
}
另外,对于使用HandlerMethodReturnValueHandler
的处理程序方法返回值,您可以执行相同的操作。