SpringMvc通过自定义注解在方法的参数中注入数据

SpringMvc通过自定义注解在方法的参数中注入数据

说一个场景,有时候我们做后台业务的时候,经常需要取session中存储的用户信息,所以免不了一直需要写下面这一段又长又无聊的代码:

MemberCommand memberCommand = (MemberCommand) request.getSession().getAttribute(SessionAttr.MEMBER_DETAIL);
1
那么怎么避免这个事情呢,下面我们就来通过一个自定义注解@MemberDetail和SpringMvc的HandlerMethodArgumentResolver接口来实现这个功能。

首先来创建我们的自定义注解:

/**
*

  • @Description 方法的参数上加了这个注解,会自动注入当前登录用户放在session中的用户对象
  • @author chenbin.sun
  • @date 2017年8月30日上午11:23:02

*/
@Documented
@Target({ ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface MemberDetail {

}

然后实现HandlerMethodArgumentResolver接口,来写我们的注入逻辑,url请求进来后走完其他一些拦截器等之后会在进入方法之前执行supportsParameter依次传入要请求方法的参数,我们只需要在这里判断这个参数,是否符合我们的要求,是否是我们想要注入的参数就可以了,如果是返回true,否则返回false,如果返回的是true那么他就会执行resolveArgument方法,此时我们只需要把我们要注入的数据return出去就可以了,详情请看下面代码。

/**

  • @Description 用于方法参数上加MemberDetail标签获取当前登录用户的信息
  • @author chenbin.sun
  • @date 2017年8月30日下午3:50:00

*/
public class MemberDetailHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

/** 登录用户信息session中的key */
private String              sessionKey         = SessionAttr.MEMBER_DETAIL;

/** 登录用户信息的class类型 */
private Class<?>            sessionMemberClass = MemberCommand.class;

@Override
public boolean supportsParameter(MethodParameter parameter) {
    // 过滤出符合条件的参数,这里指的是加了MemberDetail注解的参数
    if (parameter.hasParameterAnnotation(MemberDetail.class)) {
        return true;
    }
    return false;
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
        NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
    HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);

    // 获取session中存放的用户信息
    Object sessionMember = WebUtils.getSessionAttribute(request, sessionKey);

    if (null == sessionMember){
        return null;
    }

    // session中对象与加了MemberDetail注解的参数的类型相同是赋值给这个参数
    Class<?> klass = parameter.getParameterType();
    if (klass.isAssignableFrom(sessionMemberClass)){
        return sessionMember;
    }

    return null;
}

}

当然拉,这个实现类需要在xml中配置一下才能生效,下面看真名配置,很简单的。

<?xml version="1.0" encoding="UTF-8"?>

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="chenbin.sun.MemberDetailHandlerMethodArgumentResolver"></bean>
    </mvc:argument-resolvers>
</mvc:annotation-driven>

使用的时候只需要像下面这样将注解配置到要注入的参数上,那么请求进来后,如果session中有这个值,那么你的方法上的这个参数就一定是有值的了。

@RequestMapping("/doTest")
public String test(@MemberDetail MemberCommand memberCommand){
System.out.println(memberCommand.getName());
}

OK,就到这里,个人觉得这个还是挺实用的。

转载自所属专栏: 漫漫编程路
https://blog.csdn.net/sun5769675/article/details/77772618

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值