Java 是DTO';从RESTful web服务发送JSON时需要什么?
我正在尝试使用SpringMVC构建一个RESTfulWeb服务。我使用Jackson的FasterXMLJSON解析器在客户端和服务器端之间进行通信 我试图确定是否将DTO(数据传输对象)实现到我的RESTful API中。我目前正在利用Jackson的Java 是DTO';从RESTful web服务发送JSON时需要什么?,java,json,spring,rest,jackson,Java,Json,Spring,Rest,Jackson,我正在尝试使用SpringMVC构建一个RESTfulWeb服务。我使用Jackson的FasterXMLJSON解析器在客户端和服务器端之间进行通信 我试图确定是否将DTO(数据传输对象)实现到我的RESTful API中。我目前正在利用Jackson的@JsonProperty(access=access.WRITE_ONLY)和@JsonIgnore注释来防止敏感字段(如密码)被发送到客户端 所以,当从响应正文中省略敏感字段时,在客户端和服务器之间使用JSON进行通信时,DTO是否是必要的
@JsonProperty(access=access.WRITE_ONLY)
和@JsonIgnore
注释来防止敏感字段(如密码)被发送到客户端
所以,当从响应正文中省略敏感字段时,在客户端和服务器之间使用JSON进行通信时,DTO是否是必要的,或者注释
@JsonIgnore
和@JsonProperty
是否足以防止敏感数据泄漏?假设您讨论将实体序列化为JSON而不是JSON使用DTO不是很清楚,是的,从架构的角度来看,DTO是正确的选择。在控制器下面,最常见的是服务层,它在某个域上运行,比如说持久性实体或来自排队系统的实体
将RESTAPI与域隔离,并在服务级别将低级域实体映射到DTO是明智的做法,最常用的方法是使用POJO映射器
这将对性能产生一些影响,您可以对其进行优化,但有层间结构隔离的好处
第二个好处是,您可以从较低的层聚合信息,并尽可能地操作REST接口
若我们再次讨论实体,那个么在持久层中添加RESTAPI属性是错误的
所有这些都是从概念的角度来看的。
另一件应该阻止您为JPA2的实体提供服务的事情是,查询返回的对象是增强的对象,因此使用映射器将再次为您提供更多的控制
但是,选择映射器配置有点棘手,因为如果像在持久性/域级别映射中那样公开crud操作,则会变得多余。
暴露实体只会导致缩放问题鉴于我正在使用Jackson的
@JsonIgnore
,使用DTO的目的是什么?例如,假设我有一个User
对象,该对象具有id
、username
和password
。我将@JsonIgnore
添加到密码字段,这样当用户登录时,我只返回id
和username
,因为对象序列化时,密码
字段被忽略。这种方法是否存在任何安全漏洞?在给定的示例中,我需要DTO吗?这是可行的,但在架构上它不是首选的。稍后,您将需要创建复杂的API,如果坚持公开实体,您将混合实体和瞬态DTO,您的代码库将被污染。因此,本质上,对于每个新的信息请求,我需要一个DTO,其中包含与映射实体中的字段相同的字段子集?例如,如果我创建了一个用于注册的表单,我需要一个UserDTO,它包含表单中的字段,并带有简单的getter和setter,不多也不少?@JakeMiller如果你想重构你的JPA实体而不破坏你的Web API,会发生什么?