当前位置:首页 > 文章列表 > 文章 > java教程 > 如果跳过 DTO 会发生什么

如果跳过 DTO 会发生什么

来源:dev.to 2024-07-30 08:15:44 0浏览 收藏
推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

小伙伴们有没有觉得学习文章很有意思?有意思就对了!今天就给大家带来《如果跳过 DTO 会发生什么》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

如果跳过 DTO 会发生什么

很高兴像 SpringBoot 这样的框架可以为你做很多事情。

您只需要一个 JPA 实体类加上一个简单的存储库接口,SpringData 即可为您提供典型 CRUD 数据库操作所需的一切。

您编写了一个简单的 REST 控制器类,并且运行了一个 REST API,对吧?

嘿,但是你忘记写 DTO 了!但是,当您的应用程序无需它也可以运行时,为什么您实际上需要它呢?

当然有一些普遍的原因:

  • 分层结构(例如六边形架构或端口和适配器):为了可维护性,最好将外部通信代码与核心(业务逻辑)解耦
  • 安全性和性能:如果您按原样在 API 中公开数据库结构,您很快就会达到公开超出需要的程度;可能被恶意行为者滥用或浪费资源(CPU、内存和网络带宽)
  • 与 JPA 实体不同,DTO 可以是不可变的(您可以使用 Java 记录),这有利于数据驱动(函数式)编程风格、良好的单元测试、更安全的并发性等。

但是其他奇怪的事情也可能发生。我将根据我的经验向您展示一个奇怪的例子。

此 GitHub 存储库包含一个无需 DTO 即可运行的简单应用程序。有一个User实体,每个User可以有多个Transaction。我们甚至在存储库和 RestController 之间有一个 Service bean,用于捕获可能的数据库访问异常。

由于我们想要制作一个可用于生产的应用程序,因此我们不希望 Hibernate 生成 DDL。相反,我们有一个 schema.sql 来创建表(稍后我们可能会切换到 Flyway 或 Liquibase)。对于我们的简单示例,我们还有一个 data.sql,以便我们的表不为空。

当我们运行应用程序并调用 http://localhost:8080/users 的 API 端点时,我们会得到包含用户及其交易的预期 JSON。

现在我们关注Transaction类中的两行代码,标记为//!!

@JsonIgnore //!!

第一个味道是在 Transaction 类中我们必须向 User 引用添加 @JsonIgnore 注释。如果没有该注释,JSON 序列化会因无限递归而崩溃。

现在让我们想象一下有人犯了一个错误,向 Transaction 实体添加了另一个字段(描述),但忘记调整 SQL 语句(或者在尚未应用架构更改的环境中运行应用程序)。

私有字符串描述;//!!

当然,现在API调用失败了。但看看错误处理! UserService 内的 catch 子句未按预期工作。相反,我们可以在日志中看到奇怪的堆栈跟踪:
GlobalExceptionHandler :意外错误 org.springframework.http.converter.HttpMessageNotWritableException:无法写入 JSON:

我曾经见过这种情况(显然,应用程序比这个示例大得多),我花了很长时间才理解为什么 SQL 异常逃逸了服务以及为什么我收到 HttpMessageNotWritableException。你能看到吗?

发生的情况是,UserService 类(通过 UserRepository)仅查询 USERS 数据库表。由于默认的 Hibernate 延迟加载,事务实体不是结果的一部分。仅当 Jackson 反序列化器尝试从 User 实例创建 JSON 时,它才会调用其 getTransactions 方法,使 Hibernate 获取 Transaction 实体。

这就是为什么我们得到一个奇怪的堆栈跟踪,结合了 JSON 和 SQL 的东西。异常被 GlobalExceptionHandler 捕获,但不知道如何处理它,这就是日志消息为“意外错误”的原因。

我希望这个小练习能让您更深入地了解允许应用程序的不同层混合是多么危险。在应用程序还很小的时候只看到应用程序的“阳光灿烂的日子”场景可能会导致一些开发人员继续做错误的事情,直到为时已晚。

您不必编写映射 DTO 和应用程序其他层之间字段的样板代码。 MapStruct 可以为你做到。

今天关于《如果跳过 DTO 会发生什么》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

版本声明
本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
Java 代码优化:提高性能的技术Java 代码优化:提高性能的技术
上一篇
Java 代码优化:提高性能的技术
从新手到负载均衡器:Go Learning Adventure
下一篇
从新手到负载均衡器:Go Learning Adventure
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    3212次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    3425次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    3455次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    4564次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    3832次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码