Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是DTO';从RESTful web服务发送JSON时需要什么?_Java_Json_Spring_Rest_Jackson - Fatal编程技术网

Java 是DTO';从RESTful web服务发送JSON时需要什么?

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是否是必要的

我正在尝试使用SpringMVC构建一个RESTfulWeb服务。我使用Jackson的FasterXMLJSON解析器在客户端和服务器端之间进行通信

我试图确定是否将DTO(数据传输对象)实现到我的RESTful API中。我目前正在利用Jackson的
@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,会发生什么?