报错过程
原文件是这样写的
@Controller
@RequestMapping("manage")
public class ManageController {
/**
* 上传文件接口
* */
@RequestMapping(value = "/uploadFile", method = POST)
@ResponseBody
@SystemLog(module="通知公告",methods="上传文件接口")
public ResponseResult<Object> uploadFile(@RequestParam("file") MultipartFile file){}
}
在跑完这个接口后,后台报错
[THYMELEAF][http-nio-2320-exec-9] Exception processing template "manage/uploadFile": An error happened during template parsing (template: "/views/manage/uploadFile.html")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "/views/manage/uploadFile.html")
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:235) ~[thymeleaf-3.0.9.RELEASE.jar:3.0.9.RELEASE]
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) ~[thymeleaf-3.0.9.RELEASE.jar:3.0.9.RELEASE]
at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) ~[thymeleaf-3.0.9.RELEASE.jar:3.0.9.RELEASE]
都报错可知
因没写ResponseBody,THYMELEAF去根据请求名,去找页面去了。
/views/manage/uploadFile.html
因没有这个页面后台报错。
错误排查过程:
1.我这边前端用的layui的upload控件
upload.render({
elem: '#input'
,url: 'uploadFile'
,accept:'file'
,size:"50000"//kb
,before: function (obj) {
layer.load();
})
来进行上传文件调用后台的,所以报错被是upload控件封装了。报错如下:
起初没想到这个报错被封装的问题,以为是我写的拦截器对请求进行拦截报的错,排查了很长时间的拦截器问题。
究其原因:
如果controller层用的@RestController注解,就不会出现此问题
而我这边用到的是@Controller注解,那么返回则需要加上@ResponseBody注解。
如果未加,系统会去后台找请求路径同名的html页面(取决于拦截器写的后缀,还可能是jsp文件等)进行返回。
如果无需通过string返回页面,可以使用@RestController注解,那就不用加@ResponseBody了,也可以使用@RestController再用ModuleAndView来返回页面