Spring Controller参数自定义注入,实现传递用户信息或者任意参数

项目中需要将用户对象传递给需要的每一个请求,及注解中支持spel 的字段可以解析到对应信息。

redisson实现的分布式锁、限流、防重提交,依赖即可使用的注解工具,项目开源,可以了解一下

@RestController
public class HelloController {

    @RequestMapping("/")
    @RedissonLock(key="#user.id")
    public String index(User user) {
        return user.getName();
    }

}

public class User {
    private String name;
}

网上文章大多介绍 使用自定义注解、 HandlerInterceptor 或者 ThreadLocal,不优雅 且繁琐。

解决方案:

HandlerMethodArgumentResolver 是Spring框架中的自定义参数解析接口,可实现对Controller方法参数的自定义注入。

创建user参数解析器:

public class UserArgumentResolver implements HandlerMethodArgumentResolver {

	//supportsParameter 指定当参数类型为 User 类时才应用该参数解析器
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(User.class);
    }

	//自定义的参数解析逻辑,例如创建一个 User 对象并返回
    @Override
  public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
       
        // 例如,从请求中获取用户信息
        // User user =  WebUtils.getUser().......
        // 创建 User 对象
        User user = new User();
        user.setId("1");
        user.setUsername("张三");
        return user;
    }
}

自定义的参数解析器 注册到 Spring MVC 中:


@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new UserArgumentResolver());
    }
}
//测试
@RestController
@RequestMapping("hello")
public class HelloController {
	@GetMapping
	@RepeatSubmit(value="custom",param = "#user.id")
	public String get(User user){
		System.out.println(user.getName());
	    return "userID: "+user.getId();
	}
}

console:
张三

你可能感兴趣的:(spring,java,后端)