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

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


当前回答

@Controller在使用jsp的遗留系统中使用。它可以返回视图。 @RestController用于标记该控制器正在提供JSON响应类型的REST服务。所以它将@Controller和@ResponseBody注释包装在一起。

其他回答

正如您在Spring文档(Spring RestController documentation)中看到的,RestController注释与Controller注释相同,但假设@ResponseBody默认是活动的,因此所有Java对象都被序列化为响应体中的JSON表示。

@RestController是@Controller和@ResponseBody的组合。

@Controller类中的请求流,不使用@ResponseBody注释:

@RestController返回一个对象作为响应而不是视图。

@RestController是@Controller和@ResponseBody的组合,如果我们在方法签名中不使用@ResponseBody,那么我们需要使用@RestController。

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

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

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

如果你使用@RestController,你不能返回一个视图(通过在Spring/springboot中使用Viewresolver),并且在这种情况下不需要@ResponseBody。

如果你使用@Controller你可以在Spring web MVC中返回一个视图。