您当前的位置: 首页 >  ar

Springboot 之 HandlerMethodArgumentResolver 运用

发布时间:2022-09-30 13:33:32 ,浏览量:0

介绍

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

@RequestMapping("/normalHeaders")
 public Map normalHeaders(@RequestHeader("user-id")Long userId,
            @RequestHeader("tenant-id")Long tenantId,
            @RequestHeader("user-name")String userName){
  Map 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 文件引入依赖
 4.0.0 com.olive springmvc-headers 0.0.1-SNAPSHOT jar springmvc-headers http://maven.apache.org   org.springframework.boot  spring-boot-starter-parent  2.5.14   
    UTF-8
  8
  8
       org.springframework.boot   spring-boot-starter-test   test       org.projectlombok   lombok          org.springframework.boot      spring-boot-starter-web   
解析请求头,并包装

实现 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 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 normalHeaders(@RequestHeader("user-id")Long userId,
            @RequestHeader("tenant-id")Long tenantId,
            @RequestHeader("user-name")String userName){
  Map map = new HashMap<>();
  map.put("userId", userId);
  map.put("tenantId", tenantId);
  map.put("userName", userName);
  return map;
 }

 @RequestMapping("/wrapperHeaders")
 public Map wrapperHeaders(HeadersWrapperDTO headers){
  Map 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 注解获取请求头。

记得点「赞」和「在看」↓

爱你们

关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    111426博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0714s