SpringBoot Starter自定义注解 - 封装Header参数

本章目标

本章我们编写一个starter,目标如下:

1、提供@Header参数注解,用来封装Header参数,解决官方@RequestHeader不能使用对象接收的问题

2、完成使用示例

Starter介绍

pom.xml

<?xml version="1.0" encoding="UTF-8"?>


  4.0.0
  
    com.v5ba
    spring-boot-template
    0.0.1-SNAPSHOT
    ./../../pom.xml
  
  com.v5ba
  header-spring-boot-starter
  1.0-SNAPSHOT
  jar

  header-spring-boot-starter

  
    UTF-8
    1.8
    1.8
  

  
    
      org.springframework.boot
      spring-boot-starter
    
    
      org.springframework.boot
      spring-boot-starter-web
    
  

创建注解类Header

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

主要逻辑实现HandlerMethodArgumentResolver接口

public class HeaderMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        Annotation annotation = methodParameter.getParameterAnnotation(Header.class);
        if (annotation == null) {
            return false;
        }
        return true;
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        Class clazz = methodParameter.getParameterType();
        if (ObjectUtil.isBaseType(clazz)) {
            String paramName = methodParameter.getParameterName();
            return ObjectUtil.getBaseTypeVal(request.getHeader(paramName), clazz);
        }
        Object obj = clazz.newInstance();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            field.set(obj, ObjectUtil.getBaseTypeVal(request.getHeader(field.getName()), field.getType()));
        }
        return obj;
    }
}

public class ObjectUtil {
    public static boolean isBaseType(Class clazz) {
        if (clazz == String.class || clazz == Byte.class || clazz == Short.class
                || clazz == Integer.class ||clazz == Long.class || clazz == Double.class) {
            return true;
        }
        return false;
    }
    public static  T getBaseTypeVal(Object attrVal, Class clazz) {
        if (attrVal == null) {
            return null;
        }
        T t = null;
        if (clazz == String.class) {
            t = (T) attrVal.toString();
        } else if (clazz == Byte.class) {
            t = (T) Byte.valueOf(attrVal.toString());
        } else if (clazz == Short.class) {
            t = (T) Short.valueOf(attrVal.toString());
        } else if (clazz == Integer.class) {
            t = (T) Integer.valueOf(attrVal.toString());
        } else if (clazz == Long.class) {
            t = (T) Long.valueOf(attrVal.toString());
        } else if (clazz == Double.class) {
            t = (T) Double.valueOf(attrVal.toString());
        }
        return t;
    }
}

自动装配代码

@Configuration
public class HeaderConfiguration {
    @Bean
    public WebMvcConfigurer headerWebMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addArgumentResolvers(List resolvers) {
                resolvers.add(new HeaderMethodArgumentResolver());
            }
        };
    }
}

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.v5ba.common.header.HeaderConfiguration


使用示例

在业务项目中引入jar包


  com.v5ba
  header-spring-boot-starter
  1.0-SNAPSHOT

在接口方法的参数前增加@Header注解,支持对象和基本类型

@RestController
public class TestController {
    @PostMapping("nini")
    public String nini(@Header HeaderParam param, @Header String userCode){
        return param.getUserCode();
    }
}
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章