java - Spring Controller 中的自定义注解绑定(bind)

标签 java spring-mvc

假设我的 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/

相关文章:

Java:如何在文件中像字节数组一样写入短数组

java - 如何检测同一个java应用程序上的多个浏览器选项卡

diff - 两个java源文件的结构差异

使用 Angular 2 进行 Spring 休息

java - 如何从 Spring 服务访问对象

java - 更改Swagger中方法的主体请求中的参数

java - 如何在java swing中的两点之间绘制椭圆或椭球体

java - 创建使用外部 XML 文件的可执行 JAR 文件

java - 如何使用第二个身份验证因素来保护某些 REST 请求?

spring - 使用 thymeleaf 将表单数据发布到使用 @ModelAttribute (复杂对象)的 Controller