如果JAX-RS應用程序的方法返回一個域對象,則表示(比如JSON)將包含此對象的所有屬性 - 對嗎?但是如果這個對象會包含「私人」數據,那麼這個數據不應該暴露給網絡呢?JAX-RS是否需要數據傳輸對象(DTO)?
從外部來看另一個方向是什麼:如何防止私人領域被忽略?
唯一的解決方案似乎是創建數據傳輸對象(dto)。
要使用「automapper」將不是解決方案,除非無法指定要映射的字段。
那麼,強制JAX-RS開發人員創建DTO?還是有另一種解決方案?
如果JAX-RS應用程序的方法返回一個域對象,則表示(比如JSON)將包含此對象的所有屬性 - 對嗎?但是如果這個對象會包含「私人」數據,那麼這個數據不應該暴露給網絡呢?JAX-RS是否需要數據傳輸對象(DTO)?
從外部來看另一個方向是什麼:如何防止私人領域被忽略?
唯一的解決方案似乎是創建數據傳輸對象(dto)。
要使用「automapper」將不是解決方案,除非無法指定要映射的字段。
那麼,強制JAX-RS開發人員創建DTO?還是有另一種解決方案?
@XmlTransient
(或相應的註解)指示映射器/ marshallers不要在序列化輸出中包含註釋的屬性。
對於實體的XML的透明編組和解組,可以使用JAXB註釋對它進行註釋(可以使用JPA和JAXB註釋對類進行註釋,並且以這種方式提供XML表示以及在數據庫)。
@Entity
@XmlRootElement
public class MyEntity implements Serializable {
@Id @GeneratedValue
private Long id;
....
}
在上面的例子我只使用一個JAXB註釋@XmlRootElement
。現在,假設您不希望序列化XML中的id
屬性。只需將JAXB註解@XmlTransient
添加到它:
@Entity
@XmlRootElement
public class MyEntity implements Serializable {
@XmlTransient
@Id @GeneratedValue
private Long id;
....
}
所以,沒有,沒有嚴格的需要的DTO(和樣板代碼將它們映射到和實體)。
我認爲最好說JAX-RS要求您使用表示。
我的Foo域對象不知道它是以REST方式使用的。它只知道Bar(另一個聚合根)以及它可以通過該Bar導航的任何實體。實際上,我也有一個不使用REST甚至HTTP的應用程序的命令行界面。
我的RESTful接口將Foo/Bar包裝到通過URI鏈接到對方的表示中。我想你可以調用這些DTO,但是如果你(如其他答案中所述)只是註釋你的域模型並編組和解組,那麼我認爲你將自己編碼到禁止HATEOAS的角落。
當你有一個集合時,這也很明顯。如果Foo - > * Bar是否要返回所有的解組形式的酒吧項目?爲什麼不只是一個URI和可能的一些其他最小的數據,例如
GET富/ FFF
<foo>
<link rel="self" uri="uri="foo/fff" />
<bar uri="bar/abc123">
<status="Active" />
</bar>
<bar uri="bar/qqq">
<status="Inactive" />
</bar>
</foo>
如果客戶想更多地瞭解一個給定的酒吧,它可以
GET酒吧/ ABC123
<bar>
<link rel="self" uri="bar/abc123" />
<foo uri="foo/fff" />
<status>Active</status>
<title>Some Bar</title>
...
</bar>
當然,這只是一個開始,因爲通過HATEOAS,你將提供其他的「意味着」客戶可以採取行動的鏈接,這就是記住URIs不透明並且不必指向一個文件。例如,對於bar/abc123,您可能會將其發佈到一個欄/停用URI,並將該狀態設置爲非活動狀態。或者一個常見的停用URI - 或者其他的!含義在超文本和您定義的關係中。你*不應該被認爲只是傳遞DTO。 – 2011-08-25 18:33:20
缺點是使用這些*表示類意味着要維護的整個其他對象集。我看到有人使用Resource類本身來「表現」。也許這是更好的選擇,但它看起來很混亂。到目前爲止,我唯一的猜測是,我需要將更多邏輯推送到域服務和實體中,並將其保留在資源之外,但我避免了這種情況,因爲我不希望域名知道它的存在以RESTful方式使用。 – 2011-08-25 18:33:58
謝謝你,這就是我尋找。 – deamon 2010-01-13 16:56:59