Spring 中 @Controller 与 @RestController 的区别详解
对于很多 Java 后端开发人员来说,使用注解开发确实能极大提升效率。但在实际项目中,选对注解往往决定了接口的行为。这里重点聊聊 @RestController 这个注解。
本质上,@RestController 是 @Controller 和 @ResponseBody 的组合注解。这意味着当你在这个类上使用它时,该类下的所有方法默认都会将返回值序列化为响应体(通常是 JSON),而不是视图名称。
如果你只使用 @Controller,Spring 通常会尝试寻找一个视图解析器(如 InternalResourceViewResolver)来渲染页面(比如 JSP)。如果此时你希望返回 JSON 数据,却忘了加 @ResponseBody,或者没有正确配置视图解析器,就可能导致返回的是页面路径字符串而非预期的 JSON 内容,甚至引发错误。
反之,一旦使用了 @RestController,视图解析器就不再起作用了。方法返回的内容会直接作为 HTTP 响应体发送出去。例如,原本应该跳转到 success.jsp 的逻辑,现在只会返回 success 这个字符串本身。
下面是一个典型的控制器示例,展示了如何使用 @RestController 处理业务逻辑并返回统一结果:
@RestController
@RequestMapping("/seckill")
@CrossOrigin(allowCredentials = "true", allowedHeaders = "*")
public class WareController {
@Autowired
private WareService wareService;
@PostMapping("/createitem")
public CommonResult addWare(@Valid WareModel wareModel, BindingResult bindingResult) throws ProcessException {
// 校验参数是否有误,如有错误则抛出自定义异常
if (bindingResult.hasErrors()) {
String errorMsg = BindingResultUtil.getErrorFromBingdingResult(bindingResult);
throw new ProcessException(ProcessErrorEnum.INVALID_PARAMETER, errorMsg);
}
// 调用服务层添加商品
wareService.insertWare(wareModel);
return CommonResult.create(null, "success");
}
}

