SpringBoot实现参数解析基于注解

      我们都知道SpringMvc的Controller的方法上可以接收各种各样的参数,比如HttpServletRequestHttpServletResponse,各种注解@RequestParam@RequestHeader@RequestBody@PathVariable@ModelAttribute,这些参数是从哪里获取的?

这些参数都是由不同的参数解析器为我们解析出来的,可以解析类也可以解析带注解的类

我们可以利用解析器解析自定义的参数(类、注解),在我们需要的传入的controller方法上传入它(不需要每次都要在方法内部通过requestresponse等参数做一系列操作来获取该类对象)

1、编写注解类

@Target(value = ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginUser {
}

2、添加解析器配置类

我们想要解析参数的时候我们就需要通过更改SpringBoot的配置来添加自己实现的解析类自定义配置类实现WebMvcConfigurer接口,重写其中的addArgumentResolvers方法来添加自己的解析类(通过自动注入的方法注入)

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    SpringSSOInterceptor springSSOInterceptor;

    @Autowired
    LoginUserPinArgumentResolver loginUserPinArgumentResolver;
    
    @Autowired
    UserAuthCheckInterceptor userAuthCheckInterceptor ;

   /**
    *
    *  单点登录拦截器、用户权限拦截器
    */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(springSSOInterceptor).addPathPatterns("/**");
        registry.addInterceptor(userAuthCheckInterceptor).addPathPatterns("/**");
    }


   /**
    *
    *  登录用户参数解析登录
    */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 
         argumentResolvers.add(loginUserPinArgumentResolver);
    }
}

3、实现解析器

我们自定义解析器需要实现HandlerMethodArgumentResolver处理器方法解析器接口,并实现其中的supportsParameterresolveArgument方法

HandlerMethodArgumentResolver的接口定义如下:

(1)supportsParameter 用于判断是否支持对某种参数的解析(支持则返回true)

(2)resolveArgument 将请求中的参数值解析为某种对象(具体的操作获取解析对象)

下面这个解析器用于获取User对象(通过token获取保存在redis中的user),无需每次使用resquest和response在controller方法内部获取,可以直接获取到作为参数传入

/**
 * 自定义参数解析器
 * 解析每次都要获取的user自动传入,无需每次获取
 */
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {

    @Autowired
    private UserService userService;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(LoginUser.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);
        assert request != null;
        //COOKIE_NAME_TOKEN="token"
        String paramToken = request.getParameter(UserServiceImpl.COOKIE_NAME_TOKEN);
        String cookieToken = getCookieValue(request); 

        //通过两种方式获取,如果都获取失败则返回null
        if(StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramToken)){
            return null;
        }else {
            String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
            return userService.getUserByToken(response,token);
        }
    }

    //遍历cookie获取名称相同的那个cookie的值
    private String getCookieValue(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie:cookies){
            if(cookie.getName().equals(Constant.COOKIE_NAME_TOKEN)){
                return cookie.getValue();
            }
        }
        return null;
    }
}

到此,一个注解参数解析器就实现好了,我们可以通过传入参数的形式直接通过解析器帮我们获取到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个基于Spring框架的快速开发的框架,它的注解非常丰富,可以用来配置和控制Spring Boot应用程序的各种方面。下面是一些常用的Spring Boot注解及其解析。 1. @SpringBootApplication 这是Spring Boot应用程序的主要注解,它包含了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。其中@Configuration用于定义配置类,@EnableAutoConfiguration用于自动配置Spring Boot应用程序,@ComponentScan用于扫描组件。 2. @RestController @RestController用于定义RESTful Web服务,它是@Controller和@ResponseBody的组合注解。@Controller用于定义控制器,@ResponseBody用于返回数据。 3. @RequestMapping @RequestMapping用于定义Web请求的映射关系,它可以用于类或方法级别。在类级别上,它定义了一组请求映射,而在方法级别上,它定义了一个具体的请求映射。 4. @PathVariable @PathVariable用于从URI中提取变量值,它可以用于方法参数上。 5. @RequestParam @RequestParam用于从请求参数中提取变量值,它也可以用于方法参数上。 6. @RequestBody @RequestBody用于将请求体中的JSON或XML数据转换为Java对象,它也可以用于方法参数上。 7. @ResponseStatus @ResponseStatus用于定义响应状态码,它可以用于控制器方法上。 8. @ExceptionHandler @ExceptionHandler用于定义异常处理程序,它可以用于控制器类或方法上。 9. @Autowired @Autowired用于自动装配依赖,它可以用于属性、构造方法或方法参数上。 10. @Value @Value用于注入配置属性值,它可以用于属性或方法参数上。 以上是一些常用的Spring Boot注解及其解析,当然还有很多其他的注解,可以根据具体情况选择使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值