博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot自定义参数解析HandlerMethodArgumentResolver
阅读量:6679 次
发布时间:2019-06-25

本文共 3265 字,大约阅读时间需要 10 分钟。

自定义解析器需要实现HandlerMethodArgumentResolver接口,HandlerMethodArgumentResolver接口包含两个接口函数:

public interface HandlerMethodArgumentResolver {    boolean supportsParameter(MethodParameter var1);    @Nullable    Object resolveArgument(MethodParameter var1, @Nullable ModelAndViewContainer var2, NativeWebRequest var3, @Nullable WebDataBinderFactory var4) throws Exception;}

自定义一个解析器CurrentUserMethodArgumentResolver

我们在解析器中返回一个固定的UserBeannew UserBean(1L,"admin"),实际情况是从Session、数据库或者缓存中查。

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;/** * 用于绑定@CurrentUser的方法参数解析器 * * @author lism */public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {    public CurrentUserMethodArgumentResolver() {    }    @Override    public boolean supportsParameter(MethodParameter parameter) {        if (parameter.getParameterType().isAssignableFrom(UserBean.class) && parameter.hasParameterAnnotation(CurrentUser.class)) {            return true;        }        return false;    }    @Override    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {        CurrentUser currentUserAnnotation = parameter.getParameterAnnotation(CurrentUser.class);        //从Session 获取用户        Object object = webRequest.getAttribute(currentUserAnnotation.value(), NativeWebRequest.SCOPE_SESSION);//从  accessToken获得用户信息       if (object == null) {            String token = webRequest.getHeader("Authorization");            if (token == null) {                token = webRequest.getParameter("accessToken");            }            //为了测试先写死用户名            //TODO: 取真实用户            return new UserBean(1L,"admin");        }        return object;    }}

自定义注解@CurrentUser

import java.lang.annotation.*;/** * 

绑定当前登录的用户

*

不同于@ModelAttribute

* * @author lism */@Target({ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface CurrentUser { /** * 当前用户在request中的名字 * * @return */ String value() default "user";}

在控制器中使用@CurrentUser

在控制器方法上加入@CurrentUser UserBean userBean即可自动注入userBean的值

@RestController@RequestMapping(value = "/test")public class TestController  {    /**     * 根据name查询     *     * @param request     * @return     */    @RequestMapping(value = "/testCurrentUser", method = RequestMethod.POST, produces = "application/json", consumes = "application/json")    @ResponseBody    public void test(@CurrentUser UserBean userBean, @RequestBody SubjectRequest request) {        String createdBy = userBean.getUsername();        log.info(createdBy);    }}

User实体UserBean

import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;@Data@NoArgsConstructor@AllArgsConstructorpublic class UserBean implements Serializable {    private Long id;    private String username;}

总结

我们可以通过实现HandlerMethodArgumentResolver接口来实现对自定义的参数进行解析。

比如可以解析自定义的时间格式、自定义解析Map对象等这些spring原本不支持的对象格式。

转载地址:http://ahfao.baihongyu.com/

你可能感兴趣的文章
c# Include 与 用户控件
查看>>
等风来,不如追风去
查看>>
C语言基础学习7:返回指针值的函数
查看>>
ubuntu16.04搭建jdk1.8运行环境
查看>>
CSS布局-垂直居中问题
查看>>
form组件
查看>>
数据结构实验之链表二:逆序建立链表
查看>>
ES10(2019)新特性
查看>>
Tomcat
查看>>
开发快捷键(Eclipse,STS)
查看>>
光伏企业明年销量增幅看低
查看>>
几何:圆的割线定理
查看>>
身份证实名认证
查看>>
jquery的each()详细介绍
查看>>
12. Integer to Roman C++
查看>>
Bad Habbits
查看>>
201521123081《Java程序设计》 第1周学习总结
查看>>
[Algorithms] Longest Common Subsequence
查看>>
常见排序算法总结(含C/C++代码)
查看>>
CurrentRowColor 选中行 颜色改变
查看>>