10

SpringMvc参数解析器,让你的方法入参更优雅

 1 year ago
source link: https://www.51cto.com/article/740114.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SpringMvc参数解析器,让你的方法入参更优雅

作者:IT学习道场 2022-11-18 08:32:23
在开发中,经常会用到在控制层的对外请求接口入参中,希望通过一个注解来注入当前登录用户信息,从而在接口功能下行过程中,能够一直传下去,来实现用户信息的获取
d1808c703fa787eb743554fc98b283c034fe1c.png

spring参数解析器,让你的方法入参更优雅

曾几何时,我们编程从原始时代进入石器时代,开始拥有使用工具的思想,于是大量的工具,util和脚手架开始像雨后春笋似的出现,spring字如其名,像春天一样,奠定了万物复苏的基石,于是基于spring的大量框架开始出现,如springMvc,springboot,springcloud等,生态一时无两。作为使用spring多年的老用户,总是会好奇我们在使用开发的各种功能,于是像猫一样的探索,挖掘,模仿让人着谜的各种设计。今天分享参数解析器,实现像@RequestBody一样的功能,一个注解自动注入想要参数的方法解析器实战。废话不多说,直接上代码!

功能背景描述:

在开发中,经常会用到在控制层的对外请求接口入参中,希望通过一个注解来注入当前登录用户信息,从而在接口功能下行过程中,能够一直传下去,来实现用户信息的获取

实现步骤如下:

定义当前登录用户类 CurrentUser:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * 描述:当前登录用户 </br>
 * 作者:IT学习道场 </br>
 * 时间:2022-11-15 19:07
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CurrentUser {
    private Long userId;
    private String userName;
}

自定义注解:

import java.lang.annotation.*;
/**
 * 描述:自定义用户注解 </br>
 * 作者:IT学习道场 </br>
 * 时间:2022-11-15 16:56
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WlcUser {
}

当前用户解析器:


import com.example.demo.annotation.WlcUser;
import com.example.demo.po.CurrentUser;
import org.springframework.core.MethodParameter;
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;
/**
 * 描述:当前用户解析器 </br>
 * 作者:IT学习道场 </br>
 * 时间:2022-11-15 17:01
 */
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        //方法参数是否带有 WlcUser注解,带的话就解析执行下方 resolveArgument 方法
        return parameter.hasParameterAnnotation(WlcUser.class);
    }
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        //1 这里面可以从httpHeader中获取用户标识或者其他属性值,也可以通过springIoc中bean来执行增删改查,rpc来获取,但是要用spring的上下文来获取bean
        //2 也可以从token中解析出当前登录用户信息,返回也行对象 CurrentUser
        //3 也可以从你自己定义的用户上下文中获取 CurrentUser,前提你要自己写一个用户上下文
        //4 这里调用sprinIoc里管理的bean的话,需要 SpringContextUtil上下文来获取bean,在调用方法
        //5 这里只是自己new了一个当前用户,来直接赋予加了 WlcUser 注解修饰的对象
        CurrentUser currentUser = new CurrentUser(1L,"老王");
        return currentUser;
    }
}

把参数解析器注入到mvc中:

import com.example.demo.resolver.CurrentUserMethodArgumentResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
 * 描述:web拦截器,解析器配置类 </br>
 * 作者:IT学习道场 </br>
 * 时间:2022-11-15 19:09
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new CurrentUserMethodArgumentResolver());
    }
}

现在测试controller测试实现:

import com.example.demo.annotation.WlcUser;
import com.example.demo.po.CurrentUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 描述:参数解析解TestController </br>
 * 作者:IT学习道场 </br>
 * 时间:2022-11-16 9:25
 */
@Slf4j
@RestController
@RequestMapping("/currentUserResolver")
public class CurrentUserResolverController {

    @GetMapping("/currentUserResolve")
    public void currentUserResolve(@WlcUser CurrentUser user){
        log.info("参数解析器注入 CurrentUser = {}", user.toString());
    }
}

请求下,控制台日志:

图片

参数解析自动注入成功!自己动手丰衣足食,去玩玩吧!

责任编辑:姜华 来源: IT学习道场

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK