`
357029540
  • 浏览: 732638 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

SpringBoot集成自定义HandlerMethodArgumentResolver参数初始值解析

阅读更多

大部分摘抄自https://www.cnblogs.com/yangzhilong/p/7605889.html

传统SpringMVC集成自定义HandlerMethodArgumentResolver的方式为:http://www.cnblogs.com/yangzhilong/p/6282218.html

在SpringBoot中是去配置文件化的,具体做法有:

1、启动类继承WebMvcConfigurerAdapter

2、另外写一个@Configuration注解的来继承WebMvcConfigurerAdapter(推荐)

import java.util.List;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.longge.LoginUserInfoMethodArgumentResolver;

@SpringBootApplication
public class MyBootApplication extends WebMvcConfigurerAdapter{
    public static void main(String[] args) {
        SpringApplication.run(MyBootApplication.class, args);
    }
    
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        super.addArgumentResolvers(argumentResolvers);
        argumentResolvers.add(new LoginUserInfoMethodArgumentResolver());
    }
}

 

import org.apache.commons.lang3.StringUtils;
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;

import com.longge.utils.Constant;
import com.longge.utils.RedisCacheUtils;

/**
 * 获取用户的session dto
 */
public class LoginUserInfoMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public Object resolveArgument(MethodParameter arg0, ModelAndViewContainer arg1, NativeWebRequest arg2,
            WebDataBinderFactory arg3) throws Exception {
        String token = arg2.getHeader(Constant.TOKEN_KEY);
        if(StringUtils.isNotBlank(token)) {
            return RedisCacheUtils.getUserInfo(token);
        }
        return null;
    }

    @Override
    public boolean supportsParameter(MethodParameter arg0) {
        return arg0.getParameterType().equals(UserInfo.class);
    }

}

 使用方法:

@ApiOperation("新增")
@PutMapping("add")
public ResponseResult<SupplierDto> add(UserInfo userInfo, @Valid @RequestBody SupplierDto supplierDto) {
    // 这里的UserInfo不需要加任何注解,因为LoginUserInfoMethodArgumentResolver是对class的类型来解析的
}

 上面是直接使用class类的方式,接下来使用注解的方式来实现

import java.lang.annotation.*;

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

}

 

import com.chinamobile.annation.CurrentUser;
import com.chinamobile.dto.CurrentUserData;
import com.chinamobile.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.util.StringUtils;
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;


public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Autowired
    private RedisUtil redisUtil;

    public CurrentUserMethodArgumentResolver() {
    }

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

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        String accessToken = webRequest.getHeader("authorization");
        if (StringUtils.isEmpty(accessToken)) {
            return null;
        }

        Object object = redisUtil.get(accessToken);
        if (object instanceof CurrentUserData) {
            return object;
        }
        return null;
    }
}

 这里的RedisUtil是一个redis的处理类,自行实现就是。

import com.CurrentUserMethodArgumentResolver;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.List;

@Configuration
@Slf4j
public class ApiConfig extends WebMvcConfigurerAdapter {

    /**
     * 注册解析器bean
     *
     * @return
     */
    @Bean
    public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
        return new CurrentUserMethodArgumentResolver();
    }

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

}

 使用如下:

/**
     * 修改用户信息
     *
     * @param userId
     * @param addUserModel
     * @param currentUserData
     * @return
     */
    @PutMapping(value = "/users/{userId}")
    public CommonResponse<String> updateUser(@PathVariable("userId") Integer userId,
                                             @RequestBody AddUserModel addUserModel, 
                                             @CurrentUser CurrentUserData currentUserData) {

        CommonResponse<String> commonResponse = new CommonResponse<>();
        try {
            Integer updateBy = currentUserData.getUserId();
            // 参数校验
            if (userId == null) {
                commonResponse.setCode(ResponseCode.PARAMETER_ERROR);
                commonResponse.setMsg("参数校验未通过,请检查参数合法性");
                log.info("Parameter check failed.");
            }else {
                commonResponse.setCode(ResponseCode.SUCCESS);
                commonResponse.setMsg("修改用户成功.");
                log.info("Update user info success.");
            }
        } catch (Exception ex) {
            log.error("SERVER_ERROR: " + ex);
            commonResponse.setCode(ResponseCode.SERVER_ERROR);
            commonResponse.setMsg("SERVER_ERROR");
        }
        return commonResponse;
    }

 

分享到:
评论

相关推荐

    SpringBoot集成TDengine程序Demo

    **SpringBoot集成TDengine程序Demo**是一篇关于如何在SpringBoot应用中整合TDengine数据库的实战教程。SpringBoot以其简洁的配置和快速的开发能力深受Java开发者喜爱,而TDengine则是一款高性能、分布式、适用于...

    业务异常提示处理 springboot+Assert(自定义断言)

    本项目“业务异常提示处理 springboot+Assert(自定义断言)”着重于利用Spring Boot的特性来构建高效、易维护的业务逻辑,并通过自定义断言提升代码的可读性和可维护性。下面我们将详细探讨这些知识点。 1. **Spring...

    SpringBoot 集成FluentMybatis 学习项目

    在本项目中,我们将深入探讨如何将流行的Java框架SpringBoot与高效的ORM库FluentMybatis集成,以便在实际开发中实现高效的数据操作。SpringBoot以其简洁的配置和强大的依赖管理能力,大大简化了Web应用的搭建过程。...

    SpringBoot集成H5微信支付宝支付

    综上所述,SpringBoot集成H5微信支付宝支付,主要涉及支付接口的调用、参数配置、支付结果处理等步骤。通过合理的设计与实现,我们可以构建出高效、稳定的支付系统,提升用户的购物体验。在实际开发中,还需要根据...

    springboot集成impala(包含yml、impala配置类、pom.xml、impala jar)

    在本文中,我们将深入探讨如何在SpringBoot应用中集成Impala数据仓库系统,以及涉及到的相关配置和步骤。首先,我们来看看关键的组成部分: 1. **SpringBoot集成**: SpringBoot是基于Spring框架的一个轻量级开发...

    springboot 集成seetaface6JNI实现人脸检测识别

    在本文中,我们将深入探讨如何将SeetaFace6JNI集成到SpringBoot应用中,实现高效的人脸检测和识别功能。SeetaFace6JNI是SeetaFace6库的一个Java封装,它提供了一种与Java应用程序交互的方式,使得在Java环境中也能...

    springboot 集成webmagic实现网页数据爬取功能

    SpringBoot集成WebMagic实现网页数据爬取功能是一个常见的实践,特别是在大数据分析、信息抓取以及自动化测试等领域。这个项目提供了一个可以直接使用的示例工程,帮助开发者快速理解和应用爬虫技术。 1. **...

    springboot集成phoenix+hbase

    在IT行业中,Spring Boot是一个非常流行的Java开发框架,它简化了Spring应用的初始搭建以及开发过程。而Phoenix是一个开源的SQL层,它构建在HBase之上,提供了高性能的数据库查询能力。本示例将详细解释如何将Spring...

    springBoot集成redis

    在IT行业中,Spring Boot是一个非常流行的微服务框架,它简化了Spring应用的初始搭建以及开发过程。而Redis则是一款高性能的内存数据结构存储系统,常用于实现缓存、消息队列等功能。MyBatis作为持久层框架,为...

    springboot 2.4.4 集成ignite

    SpringBoot 2.4.4 集成Ignite是一个常见的技术实践,旨在利用Ignite的强大功能来提升应用程序的性能和可扩展性。Ignite是一个开源的内存数据网格,提供了分布式缓存、分布式计算、流处理和实时分析等功能。下面我们...

    SpringBoot整合quartz2.2.3自定义数据源和websocket通信

    在本文中,我们将深入探讨如何将SpringBoot与quartz 2.2.3集成,以及如何利用自定义数据源和WebSocket技术实现高效、灵活的定时任务管理和前后端通信。首先,我们来理解SpringBoot和quartz的核心概念。 **...

    springboot集成jsp的简单例子

    总之,这个"springboot集成jsp的简单例子"是一个很好的学习资源,它涵盖了Spring Boot与JSP集成的基本操作,以及在实际开发中经常遇到的拦截器和中文乱码问题的解决方案。对于初学者来说,这是一个很好的起点,可以...

    springboot-集成达梦数据库-源代码

    springboot-父子工程-初始版(包含CRUD示例接口) jpa-hibernate-dm: 数据库为{国产达梦数据库},持久层技术为jpa-hibernate mybatis-dm: 数据库为{国产达梦数据库},持久层技术为mybatis mybatis-plus-dm: 数据库为{...

    springboot集成富文本编辑器

    在IT行业中,Spring Boot是一个非常流行的Java开发框架,它简化了Spring应用的初始搭建以及开发过程,提供了自动配置、起步依赖等特性。本项目聚焦于将富文本编辑器集成到Spring Boot应用中,以增强用户界面的内容...

    Springboot集成flowable-modeler(6.4.1) 实现免登(BPMN组件已汉化)

    本教程将详细介绍如何将Flowable Modeler 6.4.1集成到Spring Boot项目中,并实现用户免登功能,同时确保BPMN组件已经汉化,便于中国用户使用。 首先,我们需要了解Flowable Modeler。Flowable Modeler是一款基于Web...

    Springboot2与JimuReport集成demo代码

    SpringBoot是一款由Pivotal团队开发的轻量级框架,它基于Spring框架,简化了初始化配置,提供了自动配置功能,使得开发者能够更快速地构建高质量的Web应用。而JimuReport是一款强大的在线报表工具,它可以方便地进行...

    SpringBoot整合flyway实现步骤解析

    Flyway是一个流行的数据库版本控制工具,它可以与SpringBoot框架集成,以实现自动化的数据库版本控制。在本文中,我们将详细介绍如何将Flyway与SpringBoot集成,实现数据库版本控制。 一、引入依赖 在使用Flyway...

    springboot基础框架,含请求参数自定义解析,动态数据源配置等功能

    在"springboot基础框架,含请求参数自定义解析,动态数据源配置等功能"这个项目中,我们将探讨两个关键知识点:请求参数自定义解析和动态数据源配置。 1. 请求参数自定义解析: 在SpringBoot中,我们通常使用`@...

    SpringBoot集成apollo项目演示代码

    本篇文章将深入探讨如何将Apollo集成到SpringBoot项目中,并通过提供的"SpringBoot集成apollo项目演示代码"来详细解析集成过程。 首先,我们来看`pom.xml`文件。在SpringBoot项目中,`pom.xml`是Maven的配置文件,...

    SpringBoot集成各种功能合集

    SpringBoot是一款基于Java的轻量级框架,由Pivotal团队开发,旨在简化Spring应用程序的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如JPA、Thymeleaf、WebSocket等,使得开发者可以快速地构建稳定、生产...

Global site tag (gtag.js) - Google Analytics