假设我的 Controller
中有以下方法:
@RequestMapping(method = {RequestMethod.GET}, value = "")
@ResponseBody
public Object getObject(@MyAnnotation String value) {
log.debug(value) //value is populated
...
}
我将如何将请求中的某些内容绑定(bind)到这个带注释的值? Spring 是否提供绑定(bind)过程的任何 Hook ?如果有人能指出我正确的方向,那就太好了。
谢谢!
最佳答案
是的,你可以。
Spring 使用 HandlerMethodArgumentResolver
(您可以在 javadoc 的 All Known Implementing Classes
区域中看到默认的)接口(interface)来决定将什么传递给您的 Controller 方法。
您可以创建和注册自己的 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
对处理程序方法返回值执行相同的操作。 .
关于java - Spring Controller 中的自定义注解绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18343129/