首页 > 其他分享 >Springboot 之 HandlerMethodArgumentResolver 运用

Springboot 之 HandlerMethodArgumentResolver 运用

时间:2022-09-30 13:44:40浏览次数:44  
标签:map Springboot HandlerMethodArgumentResolver userId springframework import org 

介绍

在项目中,如果需要在 Header 中获取请求头,一般使用 RequestHeader 注解。代码案例如下:

@RequestMapping("/normalHeaders")
	public Map<String, Object> normalHeaders(@RequestHeader("user-id")Long userId,
											 @RequestHeader("tenant-id")Long tenantId,
											 @RequestHeader("user-name")String userName){
		Map<String, Object> map = new HashMap<>();
		map.put("userId", userId);
		map.put("tenantId", tenantId);
		map.put("userName", userName);
		return map;
	}

请求curl

curl -X POST \
  http://127.0.0.1:8080/normalHeaders \
  -H 'tenant-id: 12' \
  -H 'user-id: 1' \
  -H 'user-name: buger'

使用 RequestHeader 注解获取请求头,如果获取一两个到不会写很多重复代码,但是如果需要获取很多个请求时,代码会变得重复。
下面介绍一种新的解决方案;不但减少了很多重复的代码,而且使得代码变得跟简洁。

pom.xml 文件引入依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.olive</groupId>
	<artifactId>springmvc-headers</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>springmvc-headers</name>
	<url>http://maven.apache.org</url>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.14</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>8</maven.compiler.source>
		<maven.compiler.target>8</maven.compiler.target>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>
</project>

解析请求头,并包装

实现 HandlerMethodArgumentResolver 类;解析请求头,包装成 HeadersWrapperDTO 类

package com.olive.config;


import com.olive.dto.HeadersWrapperDTO;
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 RequestHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().isAssignableFrom(HeadersWrapperDTO.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest,
                                  WebDataBinderFactory binderFactory) throws Exception {
        String userId = webRequest.getHeader("user-id");
        String tenantId = webRequest.getHeader("tenant-id");
        String userName = webRequest.getHeader("user-name");

        HeadersWrapperDTO headersWrapperDTO = new HeadersWrapperDTO();
        if(StringUtils.hasText(userId)){
            headersWrapperDTO.setUserId(Long.parseLong(userId));
        }
        if(StringUtils.hasText(tenantId)){
            headersWrapperDTO.setTenantId(Long.parseLong(tenantId));
        }
        headersWrapperDTO.setUserName(userName);
        return headersWrapperDTO;
    }
}

HeadersWrapperDTO POJO类

package com.olive.dto;

import lombok.Data;

import java.io.Serializable;

@Data
public class HeadersWrapperDTO implements Serializable {

    private Long userId;

    private Long tenantId;

    private String userName;

}

注册 RequestHandlerMethodArgumentResolver 到 Controller 参数解析器里,即添加自己的参数解析器

package com.olive.config;

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.WebMvcConfigurer;

import java.util.List;

@Configuration
public class MethodArgumentResolverConfig {

    @Bean
    public WebMvcConfigurer getWebMvcConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
                resolvers.add(new RequestHandlerMethodArgumentResolver());
            }
        };
    }
}

测试

编码 Springboot 启动引导类

package com.olive;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }

}

编写测试 Controller

package com.olive.controller;

import java.util.HashMap;
import java.util.Map;

import com.olive.dto.HeadersWrapperDTO;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
	
	@RequestMapping("/normalHeaders")
	public Map<String, Object> normalHeaders(@RequestHeader("user-id")Long userId,
											 @RequestHeader("tenant-id")Long tenantId,
											 @RequestHeader("user-name")String userName){
		Map<String, Object> map = new HashMap<>();
		map.put("userId", userId);
		map.put("tenantId", tenantId);
		map.put("userName", userName);
		return map;
	}

	@RequestMapping("/wrapperHeaders")
	public Map<String, Object> wrapperHeaders(HeadersWrapperDTO headers){
		Map<String, Object> map = new HashMap<>();
		map.put("userId", headers.getUserId());
		map.put("tenantId", headers.getTenantId());
		map.put("userName", headers.getUserName());
		return map;
	}

}

测试curl

curl -X POST \
  http://127.0.0.1:8080/wrapperHeaders \
  -H 'tenant-id: 12' \
  -H 'user-id: 1' \
  -H 'user-name: buger'

通过 RequestHandlerMethodArgumentResolver 可以对请求头进行解析并封装到 HeadersWrapperDTO 类中,这样减少了在 Controller 使用大量的 RequestHeader 注解获取请求头。

标签:map,Springboot,HandlerMethodArgumentResolver,userId,springframework,import,org,
From: https://www.cnblogs.com/happyhuangjinjin/p/16744652.html

相关文章

  • Springboot 之 JDBC 多数据源实现
    简介Springboot中使用JdbcTemplate实现多数据源比较简单。查看JdbcTemplate源码;可以发现JdbcTemplate提供了传入DataSource的方式构建不同的JdbcTemplate实例......
  • 学习笔记:springBoot整合七牛云
    在项目开发的过程中,文件存储是一大问题,本人遇到的情况是服务器的操作系统从原来的Linux变成了windowServer,但是,自己写的文件上传具有SFTP功能,服务器对于一些路径出现了乱......
  • SpringBoot集成Dubbo案例
    SpringBoot集成Dubbo:Case​​1、什么是Duubo?​​​​2、概念架构​​​​2.1提供者​​​​2.2消费者​​​​2.3注册中心​​​​3、SpringBoot集成Dubbo步骤​​​​:o......
  • SpringBoot文件上传深入浅出
    前言文件上传原理浏览器发起HTTPPOST请求,指定请求头:Content-Type:multipart/form-dataContent-Type:指定了文件类型服务端解析请求内容,执行文件保存处理,返回成功消息。不......
  • SpringBoot之Mybatis开启SQL记录和Pagehelper
    配置mybatismybatis:#mapper路径mapper-locations:classpath:mapper/*.xmlconfiguration:#日志输出log-impl:org.apache.ibatis.logging.stdout.StdO......
  • SpringBoot2 不同版本中 文件上传大小配置
    由于springboot具有几个版本,不同版本对于文件上传最大限制的配置也有所不同。所以要注意springboot本身的版本,不然会一直报错#在springboot1.3版本中:multipart.maxFil......
  • '~'运算符在JS中的运用【代码简化】
    直接上代码:constarr=['a','b','c']constitem='a'我们想判断item在数组中是否存在,一般情况大家会这么写:if(arr.indexOf(item)>-1){   console.log('......
  • Springboot从入门到精通
    SpringBoot创建SpringBoot有两种创建方法,一种是在IDEA中创建,一种是在Spring官网创建,两种方法是一样的,但是需要联网。SpringBoot项目快速启动1.对SpringBoot项目打包(执行......
  • springboot发送邮件
    springboot发送邮件简化版:1.pom.xml引入依赖<!--e-mail--><dependency><groupId>com.sun.mail</groupId><artifactId>java......
  • springboot+mybatis 双数据源配置
    maven依赖spring-boot-starter-webmybatis-spring-boot-startermysql-connector-javalombokapplication.ymlserver:port:8080#启动端口spring:datasource:......