spring @Controller和@RestController注释之间的区别。
@Controller注释可以同时用于Web MVC和REST应用程序吗? 如果是,我们如何区分它是Web MVC还是REST应用程序?
spring @Controller和@RestController注释之间的区别。
@Controller注释可以同时用于Web MVC和REST应用程序吗? 如果是,我们如何区分它是Web MVC还是REST应用程序?
当前回答
@RestController注释类与@Controller相同,但处理器方法上的@ResponseBody是隐含的。
其他回答
Spring4+中的新@RestController注释,它将类标记为控制器,其中每个方法返回一个域对象而不是视图。它是@Controller和@ResponseBody滚动在一起的简写。
在下面的代码中,我将向您展示两者的区别 @ controller之间
@Controller
public class RestClassName{
@RequestMapping(value={"/uri"})
@ResponseBody
public ObjectResponse functionRestName(){
//...
return instance;
}
}
和@RestController
@RestController
public class RestClassName{
@RequestMapping(value={"/uri"})
public ObjectResponse functionRestName(){
//...
return instance;
}
}
@ResponseBody默认是激活的。您不需要将它添加到函数签名之上。
@Controller:这个注释只是@Component的一个特殊版本,它允许基于类路径扫描自动检测控制器类。 @RestController:这个注释是@Controller的一个特殊版本,它自动添加@Controller和@ResponseBody注释,这样我们就不必把@ResponseBody添加到映射方法中了。
实际上,要小心——它们并不完全相同。
如果在应用程序中定义了任何拦截器,它们将不适用于标注为@RestController的控制器,但是它们可以用于标注为@Controller的控制器。
ie。拦截器的配置:
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
}
}
在Spring控制器的声明中:
@Controller
public class AdminServiceController {...
不管怎样都会起作用
@RestController
public class AdminServiceController {...
不会最终使拦截器与它相关联。
@Controller返回View。@RestController返回ResponseBody。