`
357029540
  • 浏览: 735880 次
  • 性别: 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工程自定义response注解、自定义规范化返回数据结构

    本主题将深入探讨如何在Spring Boot工程中通过自定义response注解、利用Java反射机制、设置自定义拦截器以及实现WebMvcConfigurer接口来实现这一目标。 首先,我们来看自定义response注解。在Spring Boot中,可以...

    springboot 脱敏自定义注解

    在IT行业中,Spring Boot是一个非常流行的Java开发框架,它简化了Spring应用的初始化和配置过程。在处理敏感数据时,脱敏是一个重要的安全措施,它指的是在展示或存储个人信息时,部分替换或隐藏关键信息,如身份证...

    SpringBoot集成MQTT之消息订阅处理程序

    而Spring Boot是一个用于简化Spring应用初始搭建以及开发过程的框架。 首先,我们要引入Spring Boot的MQTT客户端库,这通常依赖于Paho MQTT Java Client。在`build.gradle`或`pom.xml`文件中添加以下依赖: ```...

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

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

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

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

    SpringBoot集成H5微信支付宝支付

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

    springboot集成ckfinder3.5.1

    然后,在Spring Boot的配置文件`application.yml`或`application.properties`中,我们需要配置CKFinder的相关参数,例如访问路径、存储位置、权限控制等。这可能包括: ```yaml ckfinder: base-path: /ckfinder ...

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

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

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

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

    SpringBoot集成FastDFS文件服务器实例

    3. **配置FastDFS**:在SpringBoot的配置文件`application.yml`或`application.properties`中,配置FastDFS的相关参数,如Tracker Server的地址和端口,以及文件路径等。 4. **编写服务类**:创建一个...

    springboot集成jsp的简单例子

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

    springboot 2.4.4 集成ignite

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

    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集成jersey的框架

    再来看Druid,它是一个功能强大且性能优异的数据库连接池,提供了监控、SQL解析、参数绑定等功能。在SpringBoot项目中,我们可以通过`spring-boot-starter-jdbc` starter添加Druid,然后在`application.properties`...

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

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

    SpringBoot集成apollo项目演示代码

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

    使用SpringBoot 集成Spring-data-jpa,Druid连接池,thymeleaf模板实现的一个简单网上商城项目.rar

    1. SpringBoot:SpringBoot是Spring框架的简化版,旨在简化Spring应用的初始搭建以及开发过程。它通过自动配置、起步依赖和运行时嵌入式服务器,使得开发者可以快速地创建独立运行的、生产级别的Java应用。在本项目...

    springboot+activiti集成Demo

    1. **SpringBoot集成**: 集成步骤包括添加Activiti依赖到`pom.xml`,配置Activiti的`application.properties`,以及创建Activiti的配置类,例如`ActivitiAutoConfiguration`,用来初始化Activiti的相关组件。...

    springboot集成flyway实现数据库版本自动升级及冲突问题解决

    springboot集成flyway实现数据库版本自动升级及冲突问题解决,灵活实现升级语句的自主执行

Global site tag (gtag.js) - Google Analytics