使用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
相关产品推荐
相关产品推荐

