c.c.d.exception.GlobalExceptionHandler : 127.0.0.1 POST /login - Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [C:\Users\Administrator\AppData\Local\Temp\tomcat.6219210101206260682.9999\work\Tomcat\localhost\ROOT] is not valid
这个异常的处理方式:
1、原因:由于登录的时候,因为无相应的临时目录导致保存临时文件时失败
3、 重启相应微服务自动修复的原因:启动时会自动新建相应的临时目录
4、 解决方案:如果捕获到异常属于IOException(读写异常),且在描述中存在临时目录,则新建临时目录,再次登录时即正常。 以登录界面举例:第一次登录异常,系统进行如下提醒:“因为操作系统清理了某些关键文件,导致应用软件异常,应用软件已自动修复,请再次登录!”。再次点击登录即正常。
5、 所有涉及RequestBody,MultipartFile交互方式的微服务都有可能存在类似的问题,也就是说我们所有的微服务都要加上类似的处理。
增加代码如下:
@ExceptionHandler(value = Exception.class)
@ResponseBody
public RestError handleException(HttpServletRequest request, HttpServletResponse response, Exception e) {
logger.error("sms:"+e.getMessage());
int startIndex = e.getMessage().indexOf("[")+1;
int endIndex = e.getMessage().indexOf("]");
String exceptionStr = "";
if(startIndex!=-1&& endIndex>startIndex){
String pathName = e.getMessage().substring(startIndex, endIndex);
if(e.getCause() instanceof IOException&&pathName!=null){
logger.error("pathName:"+pathName);
if (pathName != null) {
// 保存文件的父目录
File parentFile = new File(pathName);
if (!parentFile.exists()) {
// 如果目录不存在则创建目录
parentFile.mkdirs();
}
}
exceptionStr = "因为操作系统清理了某些关键文件,导致应用软件异常,应用软件已自动修复,请再次登录!";
}
}
String requestInfo = this.getRequestInfo(request);
logger.error(requestInfo.concat(" - ").concat(e instanceof NullPointerException ? e.toString() : e.getMessage()), e);
HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
response.setStatus(status.value());
return new RestError(status.value(), exceptionStr ==""?e.getMessage():exceptionStr, request.getRequestURI());
}