我们在通过微服务SpringBoot时,通常是在service写好业务层代码,代码通过测试,再补充feign层次的代码。有的时候回发生IllegalStateException(请求状态异常)这种错误,以下是我在做java大文件上传时的一个经验教训,仅供参考
这个是我的Controller层代码,我们是通过form表单的形式接受前端的数据,所以用到了@ModelAttribute注解
@PostMapping("/uploadFile")
public ResultData<Object> uploadFile(@ModelAttribute("param") MultipartFileParam param){
String f;
try {
f = fileManageeService.chunkUploadByMappedByteBuffer(param);
} catch (IOException e) {
e.printStackTrace();
return ResultData.getFalseResultVo("上传失败,格式错误!");
}
Map<String, Object> map = Maps.newHashMap();
map.put("uploadStartus", 0);
if (StringUtils.isEmpty(f)) {
return ResultData.getSuccResultVo(map,false);
}
map.put("uploadStartus", 1);
map.put("fileUrl", f);
return ResultData.getSuccResultVo(map,false);
}
按照常规形式,feign层也需要用@ModelAttribute注解,从而接受数据,但是这就会报IllegalStateException异常,参数确实接收到了,但走到映射层时,就会发生“MultipartFileParam“的这个实体类没有经过序列化,也就是说“MultipartFileParam“这个实体类不能映射到Controller层。
@PostMapping(value="/lecture/demand/uploadFile", produces = {
MediaType.APPLICATION_JSON_UTF8_VALUE }, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResultData<Object> uploadFile( @RequestParam("chunkNumber") int chunkNumber,
@RequestParam("chunkSize") long chunkSize,
@RequestParam("totalChunks") int totalChunks,
@RequestParam("urlCode") String urlCode,
@RequestPart(value = "file", required = false) MultipartFile file,
@RequestParam("identifier") String identifier);
后来我们把“MultipartFileParam“拆分成一个个参数,重新传递值,从而解决了“MultipartFileParam“不被序列化的问题