当前位置: 代码网 > it编程>编程语言>Java > Spring MVC返回JSON视图的六种方式及对比详解

Spring MVC返回JSON视图的六种方式及对比详解

2025年08月21日 Java 我要评论
1. 方式一:@responsebody 注解作用:直接返回对象,由消息转换器(如 jackson)序列化为 json。适用场景:简单返回对象,无需自定义 http 状态码或头信息。代码示例:@con

1. 方式一:@responsebody 注解

作用:直接返回对象,由消息转换器(如 jackson)序列化为 json。

适用场景:简单返回对象,无需自定义 http 状态码或头信息。

代码示例

@controller
public class usercontroller {
    @getmapping("/user/json")
    @responsebody
    public user getuser() {
        return new user("john", 30); // 自动序列化为 json
    }
}

依赖:需引入 jackson 库(spring boot 默认已集成)。

特点

  • 简单直接,但需显式标注 @responsebody
  • 无法直接控制 http 状态码或头信息。

2. 方式二:@restcontroller 注解

作用:组合 @controller@responsebody,所有方法默认返回 json。

适用场景:restful api 控制器,所有方法均返回 json。

代码示例

@restcontroller
public class usercontroller {
    @getmapping("/user/json")
    public user getuser() {
        return new user("john", 30); // 无需 @responsebody
    }
}

依赖:同 @responsebody

特点

  • 简化配置,类级别标注即可。
  • 所有方法默认返回 json,适合 rest api。

3. 方式三:responseentity 对象

作用:返回包装对象,可自定义 http 状态码、头信息和响应体。

适用场景:需要返回特定状态码(如 404、201)或自定义头信息。

代码示例

@restcontroller
public class usercontroller {
    @getmapping("/user/json")
    public responseentity<user> getuser() {
        user user = new user("john", 30);
        return responseentity
            .status(httpstatus.created)
            .header("x-custom-header", "value")
            .body(user);
    }
}

依赖:无需额外依赖。

特点

  • 灵活性高,可控制状态码、头和响应体。
  • 适合复杂响应场景。

4. 方式四:@jsonview 控制序列化字段

作用:通过注解控制对象序列化的字段,避免暴露敏感数据。

适用场景:需要根据场景选择性序列化字段(如不同 api 版本)。

代码示例

// 定义视图类
class views {
    static class public {} 
    static class internal extends public {}
}

@restcontroller
public class usercontroller {
    @jsonview(views.public.class)
    @getmapping("/user/json/public")
    public user getpublicuser() {
        return new user("john", 30); // 只序列化 @jsonview(views.public) 的字段
    }

    @jsonview(views.internal.class)
    @getmapping("/user/json/internal")
    public user getinternaluser() {
        return new user("john", 30); // 序列化 public 和 internal 的字段
    }
}

// user 类字段配置
public class user {
    @jsonview(views.public.class)
    private string name;
    
    @jsonview(views.internal.class)
    private int age;
    // ...
}

依赖:jackson 的 @jsonview 注解。

特点

  • 精细控制序列化字段。
  • 适合不同接口 暴露不同数据。

5. 方式五:@requestbody 反序列化 + @responsebody 序列化

作用:处理 post/put 请求的 json 反序列化,同时返回 json。

适用场景:需要双向 json 交互(如 rest api)。

代码示例

@restcontroller
public class usercontroller {
    @postmapping("/user/save")
    public user saveuser(@requestbody user user) {
        // 反序列化 json 请求体到 user 对象
        return user; // 序列化为 json 响应
    }
}

依赖:jackson。

特点

  • 支持请求体反序列化和响应体序列化。
  • 适合 restful crud 操作。

6. 新增方式六:mappingjackson2jsonview

作用:通过视图解析器将模型数据转换为 json 格式的视图。

适用场景:需要兼容旧代码或特定视图配置(如传统基于视图的 mvc 流程)。

代码示例

@controller
public class usercontroller {
    @getmapping("/user/json")
    public string getuser(model model) {
        user user = new user("john", 30);
        model.addattribute("user", user); // 将数据存入模型
        return "jsonview"; // 视图名称
    }
}

视图配置

@configuration
public class webconfig implements webmvcconfigurer {
    @bean
    public view jsonview() {
        mappingjackson2jsonview view = new mappingjackson2jsonview();
        view.setextractvaluefromsinglekeymodel(true); // 自动提取模型中的值
        return view;
    }

    @override
    public void configureviewresolvers(viewresolverregistry registry) {
        registry.enablecontentnegotiation(); // 启用内容协商
        registry.viewresolver((s, locale) -> jsonview());
    }
}

依赖:需引入 org.springframework:spring-webmvc 和 jackson。

特点

  • 传统视图方式:依赖视图解析器和模型数据,流程与 jsp 等视图一致。
  • 配置复杂:需手动配置视图和视图解析器。
  • 灵活性低:无法直接控制 http 状态码或头信息。
  • 适用场景:在需要与传统视图(如 jsp)共存时使用。

对比表格(新增 mappingjackson2jsonview)

方式适用场景控制能力代码复杂度依赖是否需要视图解析器
@responsebody简单返回对象仅返回数据,无状态/头控制jackson
@restcontrollerrest api 控制器同 @responsebody,简化配置jackson
responseentity需要自定义状态码/头信息状态码、头、数据全控制无额外依赖
@jsonview需要控制序列化字段粒度控制字段序列化jackson 的 @jsonview
@requestbody + @responsebody双向 json 交互(如 post/put)反序列化请求体,序列化响应体jackson
mappingjackson2jsonview兼容旧代码或特定视图配置仅序列化模型数据,无状态/头控制spring mvc + jackson

关键差异总结(新增 mappingjackson2jsonview)

控制粒度

  • responseentity 提供最高控制(状态码、头、数据)。
  • @jsonview 用于字段级序列化控制。
  • mappingjackson2jsonview 仅能序列化模型数据,无法控制状态码或头。

代码简洁性

  • @restcontroller@responsebody 更简洁。
  • mappingjackson2jsonview 需要额外配置视图和解析器,代码复杂度较高。

适用场景

  • mappingjackson2jsonview:适合需要与传统视图(如 jsp)共存的场景,或在旧代码中逐步迁移时使用。
  • 其他方式(如 @restcontroller)更推荐用于现代 restful api 开发。

依赖与配置

  • mappingjackson2jsonview 需要显式配置视图和视图解析器,而其他方式依赖注解和消息转换器。

注意事项

  • mappingjackson2jsonview 的局限性
    • 需要通过模型传递数据,无法直接返回对象。
    • 无法直接设置 http 状态码或头信息,需通过 @responsestatushandlerinterceptor 间接实现。
  • 推荐场景
    • 在需要与传统视图(如 jsp)共存的项目中,mappingjackson2jsonview 可作为过渡方案。
    • 现代项目中更推荐使用 @restcontrollerresponseentity,因其简洁性和灵活性。

通过新增 mappingjackson2jsonview 的对比,可以更全面地理解 spring mvc 返回 json 的多种方式及其适用场景。

以上就是spring mvc返回json视图的六种方式及对比详解的详细内容,更多关于spring mvc返回json视图的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com