2016-08-02 87 views
1

我正在嘗試使用Spring MVC構建一個RESTful Web服務。我正在使用Jackson的fasterxml JSON解析器進行客戶端和服務器端之間的通信。從RESTful Web服務發送JSON時,DTO是否必需?

我想確定是否將DTO(數據傳輸對象)實現到我的RESTful API中。我目前正在利用Jackson的@JsonProperty(access = Access.WRITE_ONLY)@JsonIgnore註釋來防止敏感字段(如密碼)發送到客戶端。

所以,使用JSON當用於在客戶端和服務器之間的通信從所述響應身體省略敏感字段時是DTO的必要的或有註釋@JsonIgnore@JsonProperty足以防止敏感數據泄漏?

回答

2

假設你談論的是將實體序列化爲json而不是使用不很清晰的DTO,那麼從體系結構的角度來看,DTO是正確的選擇。在控制器下面最常見的是在某個域上運行的服務層,比方說持久化實體或來自排隊系統的實體。

將您的REST API從您的域中分離出來並將低級別域實體映射到服務級別的DTO(通常使用POJO映射器)是很正常的。

這會產生一些性能影響,您可以優化但具有層間結構隔離的好處。

第二個好處是,你可以聚合來自較低層的信息和操縱你的REST接口爲你提供最佳的服務,

如果我們再次談論的實體是錯誤的加入持久層的REST API屬性。

所有這一切都從概念的角度出發。 另一件應該阻止您爲JPA2實體提供服務的事情是,查詢返回的對象是增強型對象,因此使用映射器將再次爲您提供更多控制權。

選擇映射器配置有點棘手,雖然如果您在持久性/域級別映射變得冗餘時暴露crud操作。 公開實體只會導致縮放問題

+0

因爲我正在使用Jackson的'@ JsonIgnore',所以使用DTO的目的是什麼?例如,假設我有一個'id','username'和'password'的User'對象。我將'@ JsonIgnore'添加到密碼字段,這樣當用戶登錄時,我只返回'id'和'username',因爲當對象被序列化時'password'字段被忽略。這種方法有沒有安全漏洞?在給定的例子中,我需要一個DTO嗎? –

+0

這會起作用,但在架構上它不是首選。 稍後您將需要創建複雜的API,如果堅持暴露實體,您將混合實體和瞬態DTO,並且您的代碼庫將被污染。 –

+0

因此,基本上,對於每個新的信息請求,我需要一個DTO,其中包含與映射實體中的字段相同的字段的子集?例如,如果我創建了一個註冊表單,那麼我需要一個UserDTO,它包含表單中的字段和簡單的getter和setter,不多也不少? –