ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ModelAttribute 老革命遇上新问题

ModelAttribute  老革命遇上新问题
背景:
框架中的定义了一个统一参数,
public class OperationParam {String operation;...Map<String, Object> arg;
}

这个结构用于接收常规的RequestBody没有任何问题,但是我的一个新场景是需要上传文件,于是定义了一个新类继承他

public class OperationWithFileParam extends OperationParam{ /** * 文件参数 */ @NonNull MultipartFile file; }

controller如下:

    @PostMapping(value = "/invoke", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public SingleResponse<Object> invokeMethodWithFile(@Validated @ModelAttribute OperationInvokeWithFileCmd cmd) {return SingleResponse.success(invokeOperationService.invokeMethod(cmd, false));}

OK,前端正常传入form-data参数,这时候问题来了:
报错:无法将String转换为一个map

即便是在OperationWithFileParam 中写了

示例:

public void setArg(String arg){

setArg(JsonUtils.parseObject(arg, Map.class));
}
也不行,还没执行到这里就报错了

为什么直接使用 arg 参数会报错:
  • 表单提交的 arg 参数是 String 类型(JSON 字符串)
  • Spring 发现 Bean 有 setArg(Map) 方法,认为 arg 属性应该是 Map 类型
  • Spring 尝试将 String 转换为 Map,但没有合适的转换器
  • 于是在 ModelAttributeMethodProcessor.resolveArgument() 时抛出 typeMismatch 异常
  • 根本没有机会进入你重载的 setArg(Object) 方法

 

返回列表