最新公告
  • 欢迎您光临极客文库,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 介绍

    SpringMVC参数绑定的注解有很多,如@RequestParam,@RequestBody,@PathVariable,@RequestHeader,@CookieValue等。这些注解的实现方式很类似,都是有一个对应的解析器,解析完返回一个对象,放在方法的参数上。对参数绑定注解不熟悉的看推荐阅读
    如@RequestParam的解析器为RequestParamMethodArgumentResolver,@RequestBody的解析器为PathVariableMethodArgumentResolver等,这些解析器的原理超级简单。我先写一个自己的解析器,你大概就能猜到这些解析器的工作原理了。假如说现在有一个场景,前端每次从前面传入一个userId,而后端呢,每次都去查数据库,然后拿到用户的信息。如果有很多个controller,每个controller上来都是一样的逻辑,去查数据库,然后拿用户信息,这样的代码就很烂。如何精简呢?答案就是自定义注解实现参数绑定
    如下代码的版本为Spring Boot 2.0.4.RELEASE

    定义注解

    @Target(ElementType.PARAMETER)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface CurrentUser {

    }

    实现解析器

    public class CurrentUserUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
        /** 用于判定是否需要处理该参数分解,返回true为需要,并会去调用下面的方法resolveArgument。*/
        @Override
        public boolean supportsParameter(MethodParameter parameter) {
            return parameter.getParameterType().isAssignableFrom(User.class) && parameter.hasParameterAnnotation(CurrentUser.class);
        }
        /** 真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象。*/
        @Override
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
                                      NativeWebRequest request, WebDataBinderFactory factory) throws Exception {
            String userId = request.getParameter(“userId”);
            // 为了方便不模拟查数据库的过程,直接new一个username和password都是userId的对象
            return new User(userId, userId);
        }
    }

    加入配置

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
            resolvers.add(new CurrentUserUserHandlerMethodArgumentResolver());
        }

    }

    测试controller

    @RestController
    public class UserController {
        @RequestMapping(value = “userInfo”, method = RequestMethod.GET)
        public Map<String, String> userInfo(@CurrentUser User user) {
            Map<String, String> result = new HashMap<>();
            result.put(“username”, user.getUsername());
            result.put(“password”, user.getPassword());
            return result;
        }
    }

    应用

    访问: http://localhost:8080/userInfo?userId=1 结果为
    我这里举的是一个很简单的例子,在方法上直接拿用户的信息,方便大家理解。开发过程中的需求比这个复杂很多,大家可以发挥想象力应用参数绑定注解,如判断用户是否登录,将前端传过来的数据直接转成一个List之类,放到方法的参数上面等。
    本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
    极客文库 » @RequestParam等参数绑定注解是怎么实现的?自定义参数绑定注解的妙用

    常见问题FAQ

    如果资源链接失效了怎么办?
    本站用户分享的所有资源都有自动备份机制,如果资源链接失效,请联系本站客服QQ:2580505920更新资源地址。
    如果用户分享的资源与描述不符怎么办?
    可以联系客服QQ:2580505920,如果要求合理可以安排退款或者退赞助积分。
    如何分享个人资源获取赞助积分或其他奖励?
    本站用户可以分享自己的资源,但是必须保证资源没有侵权行为。点击个人中心,根据操作填写并上传即可。资源所获收益完全归属上传者,每周可申请提现一次。
    如果您发现了本资源有侵权行为怎么办?
    及时联系客服QQ:2580505920,核实予以删除。

    Leave a Reply

    Hi, 如果你对这款资源有疑问,可以跟我联系哦!

    联系发布者

    Leave a Reply

    Hi, 如果你对这款资源有疑问,可以跟我联系哦!

    联系发布者
    • 102会员总数(位)
    • 3674资源总数(个)
    • 2本周发布(个)
    • 0 今日发布(个)
    • 135稳定运行(天)

    欢迎加入「极客文库」,成为原创作者从这里开始!

    立即加入 了解更多
    成为赞助用户享有更多特权立即升级