springboot 自定义参数解析器,实现自定义参数的注入

作为 java web 项目,现在应该都是基于 springboot 开发了吧,最近研究了 spring 的参数解析器,发现在部分场景还是挺实用的,现把基于springboot自定义参数解析器的过程分享出来,有需要的可以直接使用现在的项目基本都是前后端分离,维持用户登录态一般都是采用 token 或类似的方法,前端请求接口的时候不需要携带具体的用户信息,只需要携带一个 token,后端校验 token的合法性以及通过token 获取用户信息。实现的方式也简单,封装一个通过token 获取用户信息的方法,在需要通过 token 获取用户信息的地方直接调用方法就可以了。但是需要用户信息的地方都要调用一下这个方法,那么有没有更加优雅的实现方式呢?答案是有的,当然你可以通过自定义切面在需要的地方解。析注入用户信息,其实呢,还有一种更加简单的方式,我们只需要实现 spring 提供的 HandlerMethodArgumentResolver 接口即可。下面我们就通过这种方式来实现一个自定义的参数解析器来在需要的地方自动解析对应的参数

首先定义一个需要解析的对象实体:

Getter
Setter
@NoArgsConstructor aA1lArgsConstructor public class user{
	private Long id;
	private string name;
	private String headpicture;
}

实现解析器:


public class UserArgumentsResolver implements HandlerMethodArgumentResolver{

	private RedisTemplateString,User>redisTemplate
	
	public UserArgumentsResolver(RedisTemplate<String, User> template) {
		this.redisTemplate = template;
	}
	@Override
	public boolean supportsParameter(MethodParameter methodParameter) {
		return methodParameter.getParameterType() == User.class;
	}
	
	@Override
	public Object resolveArguement(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) {
		HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
		String token = request.getHeader("X-token");
		if (!StringUtils.hasText(token)) {
			throw new ServiceException("token不存在");
		}	
		String tokenKey = Constant.USER_TOKEN_PREFIX + token;
		User user = redisTemplate.opsForValue().get(tokenKey);
		if (user == null) {
			throw new ServiceException("登录已失效");
		}
		return user;
	}
}

只有两个方法需要实现,一个是该解析器是否能处理该参数,这里我们判断参数是我们需要解析的类型的时候进行处理。另一个是真正解析参数的实现(一般是通过 token 从缓存中获取),实现完解析器以后,需要把我们自己实现这个解析器添加到 spring 的参数解析器集合中:

@Configuration
public class CustomMvcConfig implements WebMvcConfigurer {
	
	@Autowired
	private Resitemplate<String,User> template;

	@Override
	public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resovers) {
		resolvers.add(new userArgumentResolver(template));
	}
}

至此,主要的逻辑已经完成了,我们写一个接口进行测试:

@RestController
public class IndexController {
	
	@PostMapping("/index")
	public String index(User user) {
		return JSON.toJSONString(user);
	}
}

现在,只需要在需要使用用户信息的 controller 直接添加 User 参数即可,系统就会自动注入对应的用户信息。

好了,今天的内容就分享到这里了,一个小技巧,希望对你有帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不务正业的攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值