Spring Controller中的自定义注释绑定

Sha*_*awn 1 java spring-mvc

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

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

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

谢谢!

Sot*_*lis 5

是的你可以.

Spring使用HandlerMethodArgumentResolver(您可以All Known Implementing Classes在javadoc区域中看到默认值)接口来决定传递给控制器​​方法的内容.

您可以创建并注册自己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
    }
}
Run Code Online (Sandbox Code Playgroud)

Spring通过一个List<HandlerMethodArgumentResolver>已注册的解析器(一些默认,一些自定义注册)进行迭代,调用supportsParameter().它使用它找到的第一个支持有问题的参数.

要注册程序化配置,您可以扩展WebMvcConfigurationSupport和覆盖其方法

@Configuration
public class DispatcherContext extends WebMvcConfigurationSupport {
    @Override
    protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new MyHandlerMethodArgumentResolver());
    }
}
Run Code Online (Sandbox Code Playgroud)

在旁注中,您可以对处理程序方法返回值执行相同的操作HandlerMethodReturnValueHandler.

  • 您也可以使用`hasParameterAnnotation`而不是`getParameterAnnotation` (3认同)