本章我们编写一个starter,目标如下:
1、提供@Header参数注解,用来封装Header参数,解决官方@RequestHeader不能使用对象接收的问题
2、完成使用示例
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 条评论) “” |