【问题标题】:Avoid annotating all methods with @ResponseBody避免使用 @ResponseBody 注释所有方法
【发布时间】:2013-10-16 11:04:32
【问题描述】:

我正在创建一个 REST api,我在其中将我的域对象作为 JSON 实体返回。

到目前为止,我正在创建一个控制器,其中对于每个方法我都必须像这样注释它:

@RequestMapping(value="/entity/{id}", produces = "application/json; charset=utf-8", method=RequestMethod.GET)    
@ResponseBody
public String getEntity(@PathVariable Long id)
{
     (...)
}

由于我在这个控制器中的所有方法都是 JSON 实体,有什么方法可以提示 spring 我希望所有方法都返回 @ResponseBody 对象? 此外,我必须使用 produces = "application/json; charset=utf-8" 进行注释,否则返回的对象的编码错误(并且它们不会以 JSON 形式返回)。我是否也可以对所有方法都这样做,而不必为每个方法添加注释?

【问题讨论】:

    标签: json spring rest spring-mvc


    【解决方案1】:

    您可以在类型(类)级别上使用 @RequestMappingproduces - 对我来说它没有问题:

    @Controller
    @RequestMapping(value = "/foo", produces = "text/plain; charset=UTF-8")
    public class FooController { ... }
    

    但是,从definition 可以看出,@ResponseBody 在 Spring 3.x 中只能应用于方法级别。

    编辑: 正如@Prancer 指出的,从v4.0 开始,Spring supports @ResponseBody on type level

    【讨论】:

    • 从 Spring 4.0 版开始,@ResponseBody 可以添加到继承的类型级别,因此不需要在方法级别添加。
    • @Prancer,感谢您指出这一点。我已经相应地更新了我的答案。
    • @MichałRybak 您还应该提到 Spring 4 功能仅适用于 @RestController,不适用于 @Controller
    • @geoand 来源?从我读到的here @RestController 自动用@ResponseBody 注释,所以不需要再次注释它。此外,我找不到任何关于顶级 @ResponseBody 的提及不适用于常规 @Controller - 这应该有效,即使 @RestController 定义(如上所述)使用它。
    • @MichałRybak 我的意思是当你@RestController 你不必用@ResponseBody 注释任何东西,因为该功能是模拟的。简单地用 @Controller 注释 Spring 4 POJO 并不能提供该功能。 javabeat.net/restcontroller-spring-4-0
    猜你喜欢
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2012-07-25
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多