当前位置: 首页 > wzjs >正文

网站开发视频压缩上传什么是电商

网站开发视频压缩上传,什么是电商,网页设计手机版app下载,莱州网站设计JsonView 单一 DTO:如何实现多场景 JSON 字段动态渲染 JsonView 单一 DTO:如何实现多场景 JSON 字段动态渲染1、JsonView 注解产生的背景2、为了满足不同场景下返回对应的属性的做法有哪些?2.1 最快速的实现则是针对不同场景新建不同的 DTO…

@JsonView + 单一 DTO:如何实现多场景 JSON 字段动态渲染

  • @JsonView + 单一 DTO:如何实现多场景 JSON 字段动态渲染
    • 1、@JsonView 注解产生的背景
    • 2、为了满足不同场景下返回对应的属性的做法有哪些?
      • 2.1 最快速的实现则是针对不同场景新建不同的 DTO 对象
      • 2.2 使用 @JsonView 注解实现不同DTO对象的返回
        • 2.2.1 定义同一个 DTO 对象
        • 2.2.2 区分不同的响应视图
        • 2.2.3 Controller 层的调用
        • 2.2.4 简要信息 视图 DTO
        • 2.2.5 详情信息 视图 DTO
      • 2.3 问题已解决(引入原理实现篇)
    • 3、Debug调试篇
      • 3.1 SpringMvc 切入点 对应的核心代码片段
      • 3.2 字段属性序列化核心逻辑
      • 3.3 多种 DTO 视图 Demo 验证
        • 3.3.1 ObjectMapper 配置视图 View
        • 3.3.2 ObjectWriter 配置视图 View
      • 3.4 小结
    • 4、扩展点
      • 4.1 ResponseBodyAdvice接口
      • 4.2 RequestBodyAdvice接口

@JsonView + 单一 DTO:如何实现多场景 JSON 字段动态渲染

1、@JsonView 注解产生的背景

@JsonView 是 Jackson 库提供的一个注解,用于控制 Java 对象序列化为 JSON 时的字段可见性。通过定义不同的“视图”(View),可以灵活地决定哪些字段在特定场景下被序列化,从而避免为不同接口编写多个相似的 DTO 类。

2、为了满足不同场景下返回对应的属性的做法有哪些?

2.1 最快速的实现则是针对不同场景新建不同的 DTO 对象

在这里插入图片描述

细心的童鞋可以发现:虽然是不同的 DTO,但是存在共同的属性,而且比如后面再来一个需求,这个接口仅返回基本信息的字段(外加一个手机号字段),那么我们是不是还需要创建一个新的 DTO 对象呢?如果针对每一个接口返回都定义一个 DTO 对象的话,对于后端代码的维护也是相当的冗余操作,鉴于这种需求,有没有一种对应后端的 其他 解决方案呢?答案是有的。即就是(@JsonView注解)。

2.2 使用 @JsonView 注解实现不同DTO对象的返回

2.2.1 定义同一个 DTO 对象
/*** @Description 用户DTO* @Author Mr.Gao* @Date 2025/4/16 23:43*/
@Getter
@Setter
public class User {/*** 用户姓名*/@JsonView(SimpleInfoView.class)private String username;/*** 用户年龄*/@JsonView(SimpleInfoView.class)private Integer age;/*** 用户性别*/@JsonView(SimpleInfoView.class)private String sex;/*** =================以下信息为用户敏感信息不能给用户返回================*//*** 手机号码*/@JsonView(SensitiveInfoView.class)private String mobileNo;/*** 登录密码*/@JsonView(SensitiveInfoView.class)private String loginPwd;/*** 支付密码*/@JsonView(SensitiveInfoView.class)private String payPwd;
}
2.2.2 区分不同的响应视图
/*** @Description 简单视图展示View信息* @Author Mr.Gao*/
public interface SimpleInfoView {
}------ 视图与视图之间是可以继承的,那么也就实现既包含基础信息字段又包含需要的字段,进而实现不同DTO的返回 ---
/*** @Description 敏感信息* @Author Mr.Gao*/
public interface SensitiveInfoView extends SimpleInfoView {
}
2.2.3 Controller 层的调用
/*** @Description 用户控制层* @Author Mr.Gao* @Date 2025/4/16 23:50*/
@RestController
public class UserController {/*** 模拟从数据库获取用户信息** @return*/public static User getUserInfoFromDB() {User user = new User();user.setUsername("Mr.Gao");user.setAge(18);user.setSex("男");user.setMobileNo("12345678901");user.setLoginPwd("123456");user.setPayPwd("123456");return user;}/*** 获取用户简要信息** @return*/@JsonView(SimpleInfoView.class) // 返回简要信息的视图DTO@GetMapping("/user/getUserSimpleInfo")public User getUserSimpleInfo() {return getUserInfoFromDB();}/*** 获取用户详细信息** @return*/@JsonView(SensitiveInfoView.class)// 返回详情信息的视图DTO@GetMapping("/user/getUserDetailInfo")public User getUserDetailInfo() {return getUserInfoFromDB();}}
2.2.4 简要信息 视图 DTO

在这里插入图片描述

2.2.5 详情信息 视图 DTO

在这里插入图片描述

2.3 问题已解决(引入原理实现篇)

经过上述代码案例操作,确实是可以解决我们后端程序猿的新建多个 DTO 对象的冗余问题,童鞋们可以都试试,但是出于好奇,为了什么在 一个实体对象 DTO 和 controller 层的方法 增加 @JsonView 注解之后就能实现不同视图的效果呢?其中究竟是使用了什么魔法呢?接下来我们继续进入 Debug 调试篇,继续 gank 它。

3、Debug调试篇

3.1 SpringMvc 切入点 对应的核心代码片段

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 字段属性序列化核心逻辑

在这里插入图片描述
在这里插入图片描述

经过上述分析可得,设置视图的核心代码为 objectMapper.writerWithView(serializationView) ,然后调用 objectMapper.writeValueAsString 方法是否可以实现不同视图的 DTO 输出呢?

3.3 多种 DTO 视图 Demo 验证

3.3.1 ObjectMapper 配置视图 View
@Test
public void testJsonViewAnnotationConvertMutiDTOByObjectMapper() throws JsonProcessingException {User user = UserController.getUserInfoFromDB();// @1: 设置序列化视图为SimpleInfoView(输出简要信息)objectMapper.setConfig(objectMapper.getSerializationConfig().withView(SimpleInfoView.class));// @2: 设置序列化视图为SensitiveInfoView(输出详细信息)//objectMapper.setConfig(objectMapper.getSerializationConfig()//        .withView(SensitiveInfoView.class));System.out.println("采用Object序列化视图:" + objectMapper.getSerializationConfig().getActiveView());String JsonResult = objectMapper.writeValueAsString(user);System.out.println(JsonResult);
}
3.3.2 ObjectWriter 配置视图 View
@Test
public void testJsonViewAnnotationConvertMutiDTOByObjectWriter() throws JsonProcessingException {User user = UserController.getUserInfoFromDB();// @1: 设置序列化视图为SimpleInfoView(输出简要信息)//ObjectWriter objectWriter = objectMapper.writerWithView(SimpleInfoView.class);// @2: 设置序列化视图为SensitiveInfoView(输出详细信息)ObjectWriter objectWriter = objectMapper.writerWithView(SensitiveInfoView.class);System.out.println("ObjectWriter中的序列化视图为: " + objectWriter.getConfig().getActiveView());String JsonResult = objectWriter.writeValueAsString(user);System.out.println(JsonResult);
}

3.4 小结

最后,我本地的项目 SpringBoot 版本是 2.6.13,而我的 Pom 文件依赖中仅仅引入了spring-boot-starter-web,我可以确定的是没有引入任何 jackson 包的依赖的,而@JsonView 注解是 jackson 包下的注解,那么只有一种可能,那就是对应的 springboot 的 web 依赖集成了对应 jackson 相关 jar 包,出于好奇的我还是点开了 spring-boot-starter-web 依赖,结果发现确实是这样。
在这里插入图片描述

4、扩展点

4.1 ResponseBodyAdvice接口

对响应的内容可以进行二次包装处理,例如对响应参数内容统一进行签名、加密等逻辑处理。

4.2 RequestBodyAdvice接口

用来对请求的内容进行请求参数重写处理,例如对接收到请求参数统一进行验签、解密等逻辑处理。

综上所述,相信我们已经掌握了 如何通过一个 DTO 对象来渲染不同需求场景下的 DTO 对象,不过存在唯一的缺点,经过 Debug 调试篇我们可以发现,只有在 序列化的时候才会过滤对应的字段,那么如果一个 DTO 对象的属性太多,根据类的单一设计原则还是建议使用新建新的 DTO 对象来完成。所以我觉得可以视情况而定,想要代码的逻辑清晰一些就新建 DTO 实体,想要减少的代码的编码量(即减少 DTO 实体对象)那么就用@JsonView注解实现。
在这里插入图片描述

http://www.dtcms.com/wzjs/49972.html

相关文章:

  • 南京做网站的网络公司seo优化的作用
  • 国外的电商网站有哪些方面seo自动排名软件
  • 免费贴图素材网站seo教学免费课程霸屏
  • 微信登陆wordpress青岛seo排名扣费
  • 安徽整站优化win7优化大师
  • css 手机网站字体重叠淘宝补流量平台
  • 政府网站栏目设置市场营销专业就业方向
  • 做兼职的那个网站靠谱吗湖南长沙seo
  • 医疗网站织梦宣传广告怎么做吸引人
  • 怎么用php语言做网站网络推广推广
  • 昆明做百度网站电话百度网址大全 官网首页
  • 首次建设网站流程图培训网站有哪些
  • mysql做wp网站网站制作的重要性及步骤详解
  • 网站建设需要哪些技术东莞百度推广优化
  • 设计师培训经历怎么写长春百度关键词优化
  • 可以做头像的网站有哪些沪深300指数是什么意思
  • 安亭公司网站建设最新疫情最新数据
  • 做酒店经理的一些网站google搜索app下载
  • 来宾北京网站建设舆情分析报告
  • 个人网站 做导航爱链接
  • 韩国b2c电商网站百度竞价排名商业模式
  • 个人网站html源码营销网络推广方式有哪些
  • 政府网站建设情况交流汇报互联网营销平台
  • 公司网站的开发福州seo推广公司
  • 广州知名网站建设有哪些百度网站关键词排名助手
  • 石家庄网站建设案例郑州网络营销哪个好
  • 灌南网站定制大地资源网在线观看免费
  • 网站开发需要解决难题快速整站优化
  • 南宁免费建站模板seo是什么姓
  • asp.net做网站后台国家免费技能培训官网