springmvc.HandlerMethodArgumentResolver 使用

引言

用过springsecurity的人应该知道,在控制器方法中的参数principal 在请求的时候没有传递,却有用户的信息,跟其他用户传递了的参数又是如何封装到参数中,对象的呢,就是我们今天要解决的的问题

原因

这是由于springmvc 对我们所传递的参数进行了处理,处理成我们控制器方法中我们想要的参数

从springmvc3.1增加的HandlerMethodArgumentResolver接口,意思为策略接口解决方法参数代入参数值在给定请求的上下文。

也就是处理方法参数的一个解析器,如果了解springmvc请求过程的应该知道。

使用

如果我们要实现一个自定义的参数注入

1.写一个自定义注解

 

import java.lang.annotation.*;

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserBasic {
}

2.写一个类实现HandlerMethodArgumentResolver

 

import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
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.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

@Component
public class UserBasicArgumentResolver implements HandlerMethodArgumentResolver {
    // 我们的数据库查询服务
    @Resource
    private UserCustomService userCustomService;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 判断参数上的注解是不是等于UserBasic
        return parameter.hasParameterAnnotation(UserBasic.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter,
                                  ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest,
                                  WebDataBinderFactory binderFactory) throws Exception {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        if (request != null) {
            // 获取用户id
            String userId = request.getParameter("userId");
            // 数据库查询用户信息或者处理我们其他的业务逻辑
            return userCustomService.getUser(userId);
        }
        return null;
    }
}

3. 在web配置类注入

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.WebMvcConfigurationSupport;

import java.util.List;

@Configuration
public class WebAppConfig extends WebMvcConfigurationSupport {
    @Autowired
    private UserBasicArgumentResolver userArgumentResolver;


    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(userArgumentResolver);
    }
}

4.控制器方法为

   @RequestMapping(value = "delete", method = RequestMethod.GET)
    @ResponseBody
    public ResultBean delete(@UserBasic UserBasicVo userBasicVo) {
            return hotelService.deleteByUserId( userBasicVo.getSysCode());
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值