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 | 否 |
| @restcontroller | rest 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 状态码或头信息,需通过
@responsestatus或handlerinterceptor间接实现。
- 推荐场景:
- 在需要与传统视图(如 jsp)共存的项目中,
mappingjackson2jsonview可作为过渡方案。 - 现代项目中更推荐使用
@restcontroller和responseentity,因其简洁性和灵活性。
- 在需要与传统视图(如 jsp)共存的项目中,
通过新增 mappingjackson2jsonview 的对比,可以更全面地理解 spring mvc 返回 json 的多种方式及其适用场景。
以上就是spring mvc返回json视图的六种方式及对比详解的详细内容,更多关于spring mvc返回json视图的资料请关注代码网其它相关文章!
发表评论