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

在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中灵活地为特定参数添加额外的解析逻辑。这种方法使得代码更加清晰且易于维护。

相关推荐
William_cl10 小时前
C# ASP.NET MVC 数据验证实战:View 层双保险(Html.ValidationMessageFor + jQuery Validate)
后端·c#·asp.net·mvc
代码栈上的思考18 小时前
Spring MVC 中 @RequestMapping 路径映射与请求处理全流程
java·spring·mvc
WZTTMoon18 小时前
Spring MVC 核心工作原理:DispatcherServlet 全流程深度解析
java·spring·mvc
程序员buddha1 天前
springboot-mvc项目示例代码
java·spring boot·mvc
alien爱吃蛋挞2 天前
【JavaEE】Spring Web MVC(下)
spring·java-ee·mvc
雨白3 天前
让代码更清晰:Android 中的 MVC、MVP 与 MVVM
android·mvc·mvvm
m0_748248028 天前
Spring MVC中@RequestMapping注解的全面解析
java·spring·mvc
Kay_Liang8 天前
Spring中@Controller与@RestController核心解析
java·开发语言·spring boot·后端·spring·mvc·注解
行思理8 天前
Spring MVC 注释新手教程
java·spring·mvc
William_cl8 天前
【ASP.NET MVC 进阶】DataAnnotations 特性验证全解析:从基础到避坑,让数据校验像 “安检“ 一样靠谱
后端·asp.net·mvc