自定义 Spring MVC Controller 方法参数处理

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 【6月更文挑战第3天】在 Spring MVC Controller 的方法参数,Spring 会自动为我们注入一些特殊的参数值,比如 HttpServletRequest、HttpServletResponse 等对象,或者 HTTP 请求参数。

在 Spring MVC Controller 的方法参数,Spring 会自动为我们注入一些特殊的参数值,比如 HttpServletRequest、HttpServletResponse 等对象,或者 HTTP 请求参数。有时候,我们也可以在 Controller 中使用 @InitBinder 注解的方法,来自定义转换请求参数的逻辑。对于在整个工程的诸多地方都需要的相同的转换逻辑,我们还可以自定义一个全局的参数转换处理逻辑。

比较常见的是,很多请求方法中会需要读取当前登录的用户信息,我们以此为例,来实现一个自定义的参数处理逻辑。

最终实现的效果是,可以将保存在 Session 中的当前登录用户的 ID,注入到请求处理方法的某个参数重,这个参数使用一个注解来标记,比如这样:

@GetMapping("current")
public String right(@CurrentUserId Long userId) {
   
    return userId;
}

自定义注解的代码比较简单:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@Documented
public @interface CurrentUserId {
   
}

要使Controller 中的方法能够自动获取到当前登录用户的id,我们需要写一个参数处理的类,这个类需要继承 HandlerMethodArgumentResolver 类,并实现其中的方法:

public class CurrentUserIdArgumentResolver implements HandlerMethodArgumentResolver {
   
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
   
        return methodParameter.hasParameterAnnotation(CurrentUserId.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
   
        Object result = nativeWebRequest.getAttribute("currentUserId", NativeWebRequest.SCOPE_SESSION);
        return object;
    }
}

以上的方法当中,第一个方法,用来判断这个参数处理器支持哪些参数,方法返回 true/false 表示是否支持,这里的判断逻辑就是参数是不是有 CurrentUserId 注解。

第二个方法是具体的处理逻辑,我们这里的示例代码比较简单,直接从 Session 中读取到相应的内容,作为返回值返回。在真实的项目当中,要根据具体的业务逻辑来指定 Session key 并作必要的判断。

最后,需要将我们自定义的参数处理器配置到 Spring MVC 中。新建一个 WebMvcConfig 类,实现 WebMvcConfigurer 接口,再重写的 addArgumentResolvers 方法中添加刚刚自定义的参数处理类即可。


@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
   
...
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
   
        resolvers.add(new CurrentUserIdArgumentResolver());
    }
}

大功告成,这样,我们就可以像文章开头的那样,在 Controller 方法中使用带有自定义的注解的参数,直接获取到当前登录用户的 ID。

目录
相关文章
|
3天前
|
Java 数据库连接 API
Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
|
5天前
|
前端开发 Java 应用服务中间件
我以为我对Spring MVC很了解,直到我遇到了...
所有人都知道Spring MVC是是开发的,却鲜有人知道Spring MVC的理论基础来自于1978 年提出MVC模式的一个老头子,他就是Trygve Mikkjel Heyerdahl Reenskaug,挪威计算机科学家,名誉教授。Trygve Reenskaug的MVC架构思想早期用于图形用户界面(GUI) 的软件设计,他对MVC是这样解释的。MVC 被认为是解决用户控制大型复杂数据集问题的通用解决方案。最困难的部分是为不同的架构组件想出好的名字。模型-视图-编辑器是第一个。
我以为我对Spring MVC很了解,直到我遇到了...
|
14天前
|
前端开发 Java Spring
Spring MVC中使用ModelAndView传递数据
Spring MVC中使用ModelAndView传递数据
|
16天前
|
Java 应用服务中间件 Maven
ContextLoaderListener在Spring应用中的作用与配置方法
ContextLoaderListener在Spring应用中的作用与配置方法
|
17天前
|
存储 NoSQL Java
教程:Spring Boot与RocksDB本地存储的整合方法
教程:Spring Boot与RocksDB本地存储的整合方法
|
7天前
|
XML 前端开发 Java
Spring Boot与Spring MVC的区别和联系
Spring Boot与Spring MVC的区别和联系
|
12天前
|
Java API 微服务
Spring Boot中的跨服务调用方法
Spring Boot中的跨服务调用方法
|
12天前
|
负载均衡 监控 Java
Spring Boot与微服务治理框架的集成方法
Spring Boot与微服务治理框架的集成方法
|
12天前
|
Java API 数据中心
Spring Cloud中的服务注册与发现实现方法
Spring Cloud中的服务注册与发现实现方法
|
前端开发 Java Spring
SpringMVC之Controller查找(Spring4.0.3/Spring5.0.4源码进化对比)
0 摘要 本文从源码层面简单讲解SpringMVC的处理器映射环节,也就是查找Controller详细过程 1 SpringMVC请求流程 Controller查找在上图中对应的步骤1至2的过程 SpringMVC详细运行流程图 2 SpringMVC初始化过程 2.1 先认识两个类 Handler 通常指用于处理request请求的实际对象,可以类比 XxxController。
1290 0