在Spring中@RestController的作用等同于@Controller + @ResponseBody 注解。所以想要理解 @RestController注解就要先了解@Controller和 @ResponseBody注解。我们先看看 @RestController 注解的源码:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller @ResponseBody public @interface RestController { /** * The value may indicate a suggestion for a logical component name, * to be turned into a Spring bean in case of an autodetected component. * @return the suggested component name, if any (or empty String otherwise) * @since 4.0.1 */ @AliasFor(annotation = Controller.class) String value() default ""; }
可以看见该注解上面添加了 @Controller 和 @ResponseBody 注解。所有带有此注解的类将被视为控制器(Controller),其中 @RequestMapping方法默认情况下均采用 @ResponseBody语义。
注意:如果配置了适当的HandlerMapping-HandlerAdapter对,例如RequestMappingHandlerMapping-RequestMappingHandlerAdapter对,则 @RestController将被处理,这是MVC Java配置和MVC名称空间中的默认值。
假如我们需要开发一个获取当前日期的接口,该接口将采用“yyyy-MM-dd HH:mm:ss.SSS”格式返回日期。
(1)使用 @Controller 注解来开发接口,代码如下:
package com.huangx.springboot.springboot_restcontroller_demo1; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.text.SimpleDateFormat; import java.util.Date; @Controller @RequestMapping("/demo1") public class Demo1Controller { /** * 获取当前日期 * @return */ @RequestMapping("/getDate") @ResponseBody public String getDate() { String pattern = "yyyy-MM-dd HH:mm:ss.SSS"; SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); return dateFormat.format(new Date()); } }
上面代码使用 @Controller 注解将 Demo1Controller 类声明成一个控制器,然后在 getDate() 方法上面添加 @ResponseBody 注解。
@ResponseBody注解的作用是将控制器的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到Response对象的body区,通常用来返回JSON数据或者是XML数据。需要注意,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输出流中,他的效果等同于通过Response对象输出指定格式的数据。
接口访问地址 http://localhost:8080/demo1/getDate
(2)前面代码为了获取当前日期,我们使用 @Controller 和 @ResponseBody 两个注解,并且 @ResponseBody 注解需要添加到每个接口方法上。Spring 为了开发便捷,提供了 @RestController 方法,用法如下:
package com.huangx.springboot.springboot_restcontroller_demo1; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.text.SimpleDateFormat; import java.util.Date; @RestController @RequestMapping("/demo2") public class Demo2Controller { /** * 获取当前日期 * @return */ @RequestMapping("/getDate") public String getDate() { String pattern = "yyyy-MM-dd HH:mm:ss.SSS"; SimpleDateFormat dateFormat = new SimpleDateFormat(pattern); return dateFormat.format(new Date()); } }