Spring Controller中的自定义注释绑定

时间:2013-08-20 19:07:36

标签: java spring-mvc

假设我的Controller中有以下方法:

@RequestMapping(method = {RequestMethod.GET}, value = "")
@ResponseBody
public Object getObject(@MyAnnotation String value) {
   log.debug(value) //value is populated
   ...
}

我如何将请求中的内容绑定到此注释值? Spring是否为绑定过程提供了任何钩子?如果有人能指出我正确的方向,那就太棒了。

谢谢!

1 个答案:

答案 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的处理程序方法返回值,您可以执行相同的操作。