Controller和RestController注解区别
Controller和RestController注解在Spring框架中主要用于处理HTTP请求,但它们在返回类型和使用场景上有显著区别。
基本定义和使用场景
@Controller:这是一个通用的控制器注解,主要用于MVC(Model-View-Controller)架构中的控制器层。它标识一个类是Spring MVC的控制器处理器,负责处理HTTP请求并将处理结果返回给客户端。控制器类中的方法通常通过@RequestMapping等注解来映射特定的URL请求路径和HTTP方法。返回的结果可以是一个视图名称,框架会根据视图解析器将其解析为具体的视图页面。
@RestController:这是@Controller和@ResponseBody的组合注解,专门用于构建RESTful Web服务。它表示该类是一个Spring MVC控制器,且所有方法的返回值会直接作为HTTP响应体返回给客户端,而不是解析为视图名称。使用@RestController注解的类中的每个方法都默认返回JSON、XML或其他数据类型,而不是视图。
返回类型
@Controller:处理方法的返回值可以是String(视图名称)、ModelAndView对象或者其他适合渲染视图的数据类型。返回的视图名称由视图解析器解析为具体的视图页面。
@RestController:处理方法的返回值通常是一个具体的Java对象,该对象会被自动序列化为JSON或XML格式并返回给客户端。例如,返回一个Greeting对象会自动转换为JSON格式。
使用场景
@Controller:适用于传统的Web应用开发,需要渲染视图并与用户进行交互的场景。例如企业内部管理系统、电子商务网站的前端页面等。
@RestController:适用于构建RESTful Web服务,提供数据接口供其他系统或客户端调用的场景。例如移动应用的后端服务、微服务架构中的服务组件等。
例如:
@RestController
@Scope("prototype")
@RequestMapping("/pay/")
public class PayController {
@RequestMapping(value = "localNotifyRcv",method= RequestMethod.POST)
public ReturnResult localNotifyRcv(@RequestParam Map<String, String> getParam, HttpServletRequest request, HttpServletResponse response) {
return new ReturnResult(0, "调用成功", new HashMap<>());
}
}
public class ReturnResult {
private Integer sub_code;
private String sub_message;
private Map sub_result;
// set get方法 ..
}
调用方式:
Map<String,String> notifyMap = new HashMap<>();
notifyMap.put(”orderId”, “tt12556688”);
notifyMap.put(”status", ”1”);
//前提是:@RestController而不是@Controller 来注解接口
String url = "http://localhost:8081/pay/localNotifyRcv";
//使用字符串接收
String json = restTemplate.postForObject(url, notifyMap, String.class);
logger.info(">>>>>>构造异步通知返回结果:json=[{}],params=[{}]",json,GsonUtils.toJson(notifyMap));
//仅仅测试,测试通过。使用对象接收也可以
ReturnResult json2 = restTemplate.postForObject(url, notifyMap, ReturnResult.class);
logger.info(">>>>>>构造异步通知返回结果22:json=[{}],params=[{}]",GsonUtils.toJson(json2),GsonUtils.toJson(notifyMap));
link:异步回调方法 调用返回Cannot render error page for request xxxxx as the response has already been commited. As a result, 解决方案