在 SpringBoot Web 开发中,前端传递的请求参数格式多样,包括普通表单、JSON 格式、自定义加密参数等。如果每个接口都单独做参数解析、校验和封装,会产生大量重复代码。本文通过实现自定义HandlerMethodArgumentResolver,完成请求参数的统一解析与封装,减少冗余代码,提升代码整洁度,属于常规后端基础技术分享,无任何商业相关内容。
一、传统参数处理的问题
- 相同参数解析逻辑在多个接口重复实现
- 加密参数、自定义头参数无法直接注入 Controller
- 参数校验代码散落在业务逻辑中
- 代码维护成本高,可读性差
二、自定义参数解析器原理
Spring MVC 提供了HandlerMethodArgumentResolver接口,允许开发者自定义参数解析规则,在请求进入 Controller 之前,完成参数的解析、封装、校验,对业务代码无侵入。
核心接口:
supportsParameter:判断是否支持该参数解析resolveArgument:实际参数解析逻辑
三、具体实现
1. 自定义注解
java
运行
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestUser {
}
2. 实现参数解析器
java
运行
@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(RequestUser.class);
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) {
// 从 Header 中获取用户信息
String userId = webRequest.getHeader("userId");
String username = webRequest.getHeader("username");
// 封装为对象
UserInfo userInfo = new UserInfo();
userInfo.setUserId(userId);
userInfo.setUsername(username);
return userInfo;
}
}
3. 注册解析器
java
运行
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final UserArgumentResolver userArgumentResolver;
public WebConfig(UserArgumentResolver userArgumentResolver) {
this.userArgumentResolver = userArgumentResolver;
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(userArgumentResolver);
}
}
4. Controller 使用
java
运行
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/info")
public UserInfo getUserInfo(@RequestUser UserInfo userInfo) {
return userInfo;
}
}
四、扩展场景:统一加密参数解析
如果前端传递加密参数,可通过解析器统一解密:
java
运行
@Override
public Object resolveArgument(...) {
String encrypted = webRequest.getParameter("data");
String json = AESUtil.decrypt(encrypted, AES_KEY);
return JSON.parseObject(json, ParamDTO.class);
}
五、优势总结
- 消除重复参数解析代码
- 业务 Controller 无侵入
- 统一参数校验、解密、封装
- 代码结构更清晰、易于维护
六、适用场景
- 统一获取请求头用户信息
- 统一解密前端加密参数
- 统一封装公共请求参数
- 简化 Controller 逻辑