spring里面 @Controller和@RestController注解的区别

问题:spring里面 @Controller和@RestController注解的区别

spring里面 @Controller和@RestController注解的区别

Web MVC和REST applications都可以用@Controller吗?
如果是的话,怎么样区别这个一个 Web MVC还是REST application呢

回答一

下面的代码向你展示了@controller和 @RestController的区别


@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

@ResponseBody 在缺省的情况下会被激活. 你不需要在方法声明那里加上。

回答二

  • @Controller 用于标记类是 Spring MVC Controller
  • @RestController是一种加上了@Controller和@ResponseBody的便捷注解(请看Javadoc)
    所以下面定义的两个controller应该是一样的
@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }

回答三

事实上,小心点,它们不是完全相同的

如果你的应用程序定义了任何interceptors,它们就不能作用在 注解了@RestController的Controllers 上,但是他们对于标注了@Controller的controller还是起作用的。

拦截器的配置:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
    }

}

声明一个 Spring controller:

@Controller
public class AdminServiceController {...
Will work, however

@RestController
public class AdminServiceController {...

最终就没有拦截器和它关联了

回答四

正如你在Spring文档(Spring RestController documentation)中看到的,RestController注解与Controller注解相同,但是@ResponseBody默认是生效的,因此所有Java对象在响应体中都被序列化为JSON格式。

回答五

Spring4以上版本中的新注解@RestController将类标记为一个controller,其中每个方法返回一个对象而不是一个视图。它是@Controller和@ResponseBody结合在一起的的缩写。

文章翻译自Stack Overflow:https://stackoverflow.com/questions/25242321/difference-between-spring-controller-and-restcontroller-annotation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值