记一次没加@ResponseBody引起的报错,@RestController、@Controller、@ResponseBody三注解使用错误导致

文章描述了一个在使用Thymeleaf模板引擎时遇到的错误,该错误发生在尝试解析/uploadFile模板时。问题的根本原因是Controller方法中未使用@ResponseBody注解,导致Thymeleaf试图寻找一个名为/uploadFile的HTML页面。使用Layui的上传组件调用后台接口,当Controller使用@Controller而不是@RestController时,需要添加@ResponseBody以防止系统查找同名的HTML页面。解决方案包括使用@RestController注解或在@Controller中添加@ResponseBody注解。

报错过程

原文件是这样写的

@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来返回页面

`@ResponseBody` 注解和 `@RestController` 注解Spring MVC 中都与响应数据的处理相关,但它们存在一些区别: ### 注解类型和使用位置 - `@ResponseBody` 是一个方法级别的注解,可以添在控制器类的方法上,用于将该方法的返回值直接作为 HTTP 响应体返回,而不是进行视图解析。示例如下: ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloController { @GetMapping("/test") @ResponseBody public String sayHello() { return "Hello, World!"; } } ``` - `@RestController` 是一个类级别的注解,是 `@Controller` 和 `@ResponseBody` 的组合注解使用 `@RestController` 注解的类,其所有的处理方法都会默认添 `@ResponseBody` 注解,即所有方法的返回值都会直接作为 HTTP 响应体返回,而不会进行视图解析。示例如下: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HttpController { @GetMapping("/testRestController") public String testRestController() { return "success"; } } ``` ### 功能侧重点 - `@ResponseBody` 主要用于对单个方法进行配置,实现将方法返回值直接写入 HTTP 响应体的功能,可灵活控制哪些方法需要返回响应体,哪些方法需要进行视图解析。 - `@RestController` 主要用于创建 RESTful 风格的控制器,适用于整个控制器类的所有方法都需要返回响应体的场景,简化了代码编写,避免在每个方法上都添 `@ResponseBody` 注解。 ### 页面跳转功能 - 使用 `@ResponseBody` 注解时,如果控制器类使用 `@Controller` 注解,那么有添 `@ResponseBody` 注解的方法仍然可以进行视图解析,实现页面跳转。 - 使用 `@RestController` 注解的类,所有方法的返回值都会作为响应体返回,无法实现页面跳转功能。如果类中有一个方法需要实现页面跳转,类上就不能使用 `@RestController` 注解 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静安书以沫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值