You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Spring自定义HandlerMethodArgumentResolver出现参数类型不匹配异常如何解决

问题根因

你当前自定义参数解析器的supportsParameter方法会匹配所有CommonHeader及其子类类型的控制器参数,本次请求中控制器参数类型是GetDataRequest(CommonHeader的子类),满足匹配规则。但resolveArgument方法中固定返回CommonHeader父类的实例,父类实例无法向下转型为子类GetDataRequest类型,因此抛出argument type mismatch类型不匹配异常。

修复方案

修改resolveArgument方法,根据控制器参数的实际类型动态创建实例,代码调整如下:

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
    // 获取控制器参数的实际类型
    Class<?> paramType = parameter.getParameterType();
    // 反射创建对应类型的实例,要求所有CommonHeader的子类都保留无参构造方法
    CommonHeader instance = (CommonHeader) paramType.getDeclaredConstructor().newInstance();
    
    String userId = webRequest.getHeader("UserID");
    instance.setUser_id(userId);
    // 可补充ip_address、request_id等其他公共字段的赋值逻辑
    return instance;
}

额外注意事项

当前自定义解析器会接管整个GetDataRequest类型参数的解析,Spring默认的请求参数绑定逻辑不会再生效,若GetDataRequest中的name1、name2字段需要从请求参数中取值,你需要在自定义解析器中补充对应字段的赋值逻辑,或者调整参数结构,将CommonHeader单独作为一个控制器方法参数,和业务请求参数拆分。

内容的提问来源于stack exchange,提问作者Taslim Sama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:09:03