2010-01-13 25 views
3

如果JAX-RS應用程序的方法返回一個域對象,則表示(比如JSON)將包含此對象的所有屬性 - 對嗎?但是如果這個對象會包含「私人」數據,那麼這個數據不應該暴露給網絡呢?JAX-RS是否需要數據傳輸對象(DTO)?

從外部來看另一個方向是什麼:如何防止私人領域被忽略?

唯一的解決方案似乎是創建數據傳輸對象(dto)。

要使用「automapper」將不是解決方案,除非無法指定要映射的字段。

那麼,強制JAX-RS開發人員創建DTO?還是有另一種解決方案?

回答

1

@XmlTransient(或相應的註解)指示映射器/ marshallers不要在序列化輸出中包含註釋的屬性。

+0

謝謝你,這就是我尋找。 – deamon 2010-01-13 16:56:59

3

對於實體的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(和樣板代碼將它們映射到和實體)。

+0

!真酷! – deamon 2010-01-13 16:56:17

+0

@XmlTransient是否支持每種輸出格式JAX-RS支持還是僅限於XML和JSON? – deamon 2010-01-13 17:05:59

+0

@XmlTransient來自JAXB,JAXB用於XML。 JSON輸出器恰好支持子集。所以它取決於用於格式問題的序列化程序。 FWIW,我不知道其他'標準'串行器,所以它可能是一個有爭議的問題。 – StaxMan 2010-02-08 00:27:07

2

我認爲最好說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> 
+0

當然,這只是一個開始,因爲通過HATEOAS,你將提供其他的「意味着」客戶可以採取行動的鏈接,這就是記住URIs不透明並且不必指向一個文件。例如,對於bar/abc123,您可能會將其發佈到一個欄/停用URI,並將該狀態設置爲非活動狀態。或者一個常見的停用URI - 或者其他的!含義在超文本和您定義的關係中。你*不應該被認爲只是傳遞DTO。 – 2011-08-25 18:33:20

+1

缺點是使用這些*表示類意味着要維護的整個其他對象集。我看到有人使用Resource類本身來「表現」。也許這是更好的選擇,但它看起來很混亂。到目前爲止,我唯一的猜測是,我需要將更多邏輯推送到域服務和實體中,並將​​其保留在資源之外,但我避免了這種情況,因爲我不希望域名知道它的存在以RESTful方式使用。 – 2011-08-25 18:33:58

相關問題