1

假设我有以下方法Controller

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

我将如何将请求中的某些内容绑定到这个带注释的值?Spring 是否在绑定过程中提供任何挂钩?如果有人能指出我正确的方向,那就太好了。

谢谢!

4

1 回答 1

7

是的你可以。

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

于 2013-08-20T19:25:01.070 回答