spring @Controller和@RestController注释之间的区别。

@Controller注释可以同时用于Web MVC和REST应用程序吗? 如果是,我们如何区分它是Web MVC还是REST应用程序?


当前回答

而不是使用@Controller和@ResponseBody, @RestController让你在Spring 4.0和更高版本中公开Rest api。

其他回答

而不是使用@Controller和@ResponseBody, @RestController让你在Spring 4.0和更高版本中公开Rest api。

Spring4+中的新@RestController注释,它将类标记为控制器,其中每个方法返回一个域对象而不是视图。它是@Controller和@ResponseBody滚动在一起的简写。

@RestController注释类与@Controller相同,但处理器方法上的@ResponseBody是隐含的。

@Controller用于将类标记为Spring MVC Controller。 @RestController是一个方便的注释,它只添加了@Controller和@ResponseBody注释(参见:Javadoc)。

所以下面两个控制器定义应该做同样的事情

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }

实际上,要小心——它们并不完全相同。

如果在应用程序中定义了任何拦截器,它们将不适用于标注为@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 {...

不会最终使拦截器与它相关联。