springmvc中如何自定义入参注解并自动注入值

news2025/3/20 20:44:07

在Spring中,`HandlerMethodArgumentResolver` 是一个非常强大的接口,用于自定义控制器方法参数的解析逻辑。以下是一个完整的示例,展示如何使用 `HandlerMethodArgumentResolver` 并结合自定义注解来实现特定的参数解析逻辑。

### **1. 定义自定义注解**

首先,定义一个自定义注解,用于标记需要特殊处理的参数。例如,定义一个 `@CurrentUser` 注解,用于注入当前用户信息:

```java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.PARAMETER) // 仅适用于方法参数
@Retention(RetentionPolicy.RUNTIME) // 运行时保留
public @interface CurrentUser {
}
```

### **2. 创建自定义 `HandlerMethodArgumentResolver`**

接下来,创建一个自定义的 `HandlerMethodArgumentResolver` 实现类,用于解析带有 `@CurrentUser` 注解的参数:

```java
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.servlet.http.HttpServletRequest;

public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 检查参数是否带有 @CurrentUser 注解,并且类型是否为 User 类型
        return parameter.hasParameterAnnotation(CurrentUser.class) && parameter.getParameterType().equals(User.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                   NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // 获取当前用户信息,这里假设从请求中获取用户ID,并根据ID获取用户信息
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        String userId = request.getHeader("X-User-Id"); // 假设用户ID存储在请求头中
        return getUserById(userId); // 获取用户信息
    }

    private User getUserById(String userId) {
        // 这里是你的逻辑来获取当前用户,例如从数据库中查询
        // 返回一个示例用户
        return new User(userId, "John Doe");
    }
}
```

### **3. 注册自定义 `HandlerMethodArgumentResolver`**

在Spring配置中注册自定义的 `HandlerMethodArgumentResolver`,使其生效:

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private CurrentUserArgumentResolver currentUserArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(currentUserArgumentResolver);
    }
}
```

### **4. 使用自定义注解**

在Controller方法中使用自定义注解,注入当前用户信息:

```java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/user/info")
    public String getUserInfo(@CurrentUser User currentUser) {
        // 使用currentUser对象,它已经被解析器填充了
        return "User info for: " + currentUser.getName();
    }
}
```

### **5. 测试**

启动Spring Boot应用后,访问 `/user/info` 端点,并在请求头中添加 `X-User-Id`,例如:

```
GET /user/info
Headers:
  X-User-Id: 12345
```

如果一切配置正确,`CurrentUserArgumentResolver` 将会被调用,并将当前用户的信息注入到 `getUserInfo` 方法的 `currentUser` 参数中,返回类似以下内容:

```
User info for: John Doe
```

### **总结**

通过定义自定义注解并结合 `HandlerMethodArgumentResolver`,可以在Spring MVC中灵活地为特定参数添加额外的解析逻辑。这种方法使得代码更加清晰且易于维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity--GPT-SoVITS接入、处理GPTAPI的SSE响应流

GPT-SoVITS GPT-SoVITS- v2&#xff08;v3也可以&#xff0c;两者对模型文件具有兼容&#xff09; 点击后 会进入新的游览器网页 ----- 看了一圈&#xff0c;发现主要问题集中在模型的训练很需要CPU&#xff0c;也就是模型的制作上&#xff0c;问题很多&#xff0c;如果有现有…

Redis哈希槽机制的实现

Redis哈希槽机制的实现 Redis集群使用哈希槽&#xff08;Hash Slot&#xff09;来管理数据分布&#xff0c;整个集群被划分为固定的16384个哈希槽。当我们在集群中存储一个键时&#xff0c;Redis会先对键进行哈希运算&#xff0c;得到一个哈希值。然后&#xff0c;Redis将该哈…

docker pull 提示timeout

通过命令行拉取对应的mysql版本提示网络超时。 开始排查&#xff0c;首先确认是否能浏览器访问。ok的&#xff0c;可以正常访问。 终端curl 排查嗯 有问题 改了下 终端 vim ~/.zshrc 加入 export HTTP_PROXY"http://127.0.0.1:7890" export HTTPS_PROXY"…

(超详细) ETL工具之Kettle

Kettle简介 kettle最早是一个开源的ETL工具&#xff0c;后命名为Pentaho Data Integration。由JAVA开发&#xff0c;支持跨平台运行&#xff0c;其特性包括&#xff1a;支持100%无编码、拖拽方式开发ETL数据管道&#xff0c;可对接包括传统数据库、文件、大数据平台、接口、流…

random_masking 函数测试

文章目录 1. description2. excel3. pytorch code 1. description 功能&#xff1a;按一定比例的随机部分样本&#xff0c;简单来说就是按照一定的比例将行向量从小到大的顺序提取出来。思考1&#xff1a; 用了均匀分布&#xff0c;并且按照一定比例&#xff0c;取前prob概率来…

TDengine 中的流式计算

简介 TDengine 中的流计算&#xff0c;功能相当于简化版的 FLINK &#xff0c; 具有实时计算&#xff0c;计算结果可以输出到超级表中存储&#xff0c;同时也可用于窗口预计算&#xff0c;加快查询速度。 创建流式计算 CREATE STREAM [IF NOT EXISTS] stream_name [stream_o…

Java 大视界 -- Java 大数据在智慧交通自动驾驶仿真与测试数据处理中的应用(136)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

JVM的一些知识

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; VMw…

C语言每日一练——day_7

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第七天。&#xff08;连续更新中&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…

Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹

引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…

用hexo初始化博客执行hexo init时碰到的问题

用hexo初始化博客执行hexo init时碰到的问题 $ hexo init myblog INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git fatal: unable to access https://github.com/hexojs/hexo-starter.git/: SSL certificate problem: unable to get local issuer cer…

4.1--入门知识扫盲,ISO知识体系介绍(看一遍,协议啥的全部记住)

OSI七层模型&#xff1a;网络世界的"七重天"生存指南&#xff08;附快递小哥版图解&#xff09; “如果你觉得网络分层很抽象&#xff0c;那就想象自己在寄快递” —— 来自一个被三次握手逼疯的程序员 开场白&#xff1a;网络通信就像送外卖 假设你要给隔壁妹子送奶…

AI训练如何获取海量数据,论平台的重要性

引言&#xff1a;数据——AI时代的“新石油” 在人工智能和大模型技术飞速发展的今天&#xff0c;数据已成为驱动技术进步的 “ 燃料 ”。无论是训练聊天机器人、优化推荐算法&#xff0c;还是开发自动驾驶系统&#xff0c;都需要海量、多样化的数据支持。 然而&#xff0c;获…

Git 使用SSH登陆

一、SSH介绍 SSH连接相比于HTTP连接会简单一点&#xff0c;因为SSH连接通过了私钥与公钥进行身份认证&#xff0c;这样就不需要像HTTP一样&#xff0c;每次clone或者操作仓库都需要输入密码 其中私钥和密钥是需要在自己电脑上生成的&#xff0c;通过命令即可生成一个私钥和一个…

织梦DedeCMS修改文章【标题、短标题、关键词】长度限制

在后台虽然可以设置标题的长度&#xff0c;但是数据库的字段固定是60个字符&#xff0c;短标题是36字符&#xff0c;关键词30字符&#xff0c;所以这里教大家修改一下织梦DedeCMS修改【标题】【短标题】【关键词】长度限制 一、后台配置 1、进入dede后台管理 -> 系统 ->…

Powershell WSL部署ubuntu22.04.5子系统

前提条件WSL 安装 wsl 安装参考1wsl 安装csdn参考2wsl 百度网盘离线下载 本地目录安装ubuntu22.04.5 子系统 powershell 管理员打开执行(实现,下载安装ubuntu子系统,用户创建,远程ssh登录设置,防火墙端口开放)子系统IP 查看方法wsl

umi自带的tailwindcss修改为手动安装

1》为什么改为手动&#xff1f; 主要是为了解决这个报错问题&#xff0c;虽然重新运行也可解决&#xff0c;但是总是要运行2-3次&#xff0c;比较麻烦 2》如何手动 1&#xff0c;先在devDependencies下安装这两个包 pnpm install postcss8.5.1 -D "autoprefixer"…

麒麟V10 arm cpu aarch64 下编译 RocketMQ-Client-CPP 2.2.0

国产自主可控服务器需要访问RocketMQ消息队列&#xff0c;最新的CSDK是2020年发布的 rocketmq-client-cpp-2.2.0 这个版本支持TLS模式。 用默认的版本安装遇到一些问题&#xff0c;记录一下。 下载Releases apache/rocketmq-client-cpp GitHubhttps://github.com/apache/roc…

使用码云搭建CocoaPods远程私有库

一、创建远程私有索引库 用来存放私有框架的详细描述信息.podspec文件 1. 创建私有库 假设码云上创建的私有库为repo-spec 2. 查看本地已存在的索引库 pod repo list 3. 将远程私有索引库添加到本地 pod repo add [https://gitee.com/jingluoguo/repo-spec.git](https://gi…

专访LayaAir引擎最有价值专家-施杨

在 LayaAir 引擎的资源商店中&#xff0c;许多开发者都会注意到一个熟悉的名字——“射手座”。他不仅贡献了大量高质量的 Shader 资源&#xff0c;让一些开发者通过他的作品了解到 LayaAir 引擎在 3D 视觉效果上的更多可能&#xff0c;也让大家能够以低成本直接学习并应用这些…