2010-01-10 58 views
1

我有一些POJO,這是我正在工作的這個RESTful API的基礎。但是,我需要包含一些其他信息以使API更完整。我真的不想把這些額外的信息放在POJO中,但將它包含在Web服務層,就好像它一樣。春季MarshallingView調整輸出?

它涉及有「約會」的「人」。每個約會只有一個人。

因此,我有一個像/ Patients/1這樣的RESTful調用,它基本上抓住了Person的POJO,我正在使用XStream來序列化併發送它。這很好,但我想這樣做:

<Person> 
<firstName>James</firstName> 
... other fields ... 
<nextAppointment href="/Appointment/12345>2010-02-19</nextAppointment> 
<prevAppointment href="/Appointment/12346>2010-01-01</prevAppointemnt> 
</Person> 

哪裏下一個和prev約會實際上不包括在人POJO。我正在尋找一種很好的「春季方式」來實現這一目標。客戶可以這樣做/ Patients/1/PreviousAppointment和/ Patients/1/NextAppointment,但我期望減少通話量(可能是預優化?),並讓他們獲得更多信息的方式,如果他們需要它通過使用他href。

這是非常優雅的使用XStreamMarshaller,因爲我所做的一切都是POJO或POJO列表處理視圖。但是我需要醫生們在送出之前稍微提高一點。

謝謝!

回答

1

這是將業務對象直接交給編組人員的問題 - 您在將對象轉換爲響應方面的靈活性很小。對於自己預先轉換對象有一些東西要說,你可以通過這種方式獲得更多的控制權。

所以,如果你有一個特定的輸出結構,然後用XStream你需要建立一個類似於它的類結構。然後,將您的業務對象轉換爲該類結構,然後將其傳遞給XStream。

它看起來可能不那麼優雅,但是您的系統將不會因您的業務對象模型(您當前的基於XStream的系統)的細微更改而被打破。

+1

這是有道理的。所以我想我基本上有兩種選擇,可以使用我自己的各種業務對象自己生成XML,也可以創建一個新對象,它代表我想要的輸出格式並在其上使用XStream。 新對象的問題是它需要一堆膠水代碼和實際POJO對象的大部分字段的重複。 我現在只是想讓客戶通過額外的API調用收集額外的信息,直到證明性能是不可接受的。 – 2010-01-10 13:19:55

1

解決問題的方法:創建一個CUSTOMIZEDCONVERTER ...

公共類CustomizedConverter實現轉換器{

@覆蓋 公共無效元帥(對象源,HierarchicalStreamWriter作家,MarshallingContext上下文){.... }

@Override 公共對象解組(HierarchicalStreamReader讀卡器,UnmarshallingContext上下文){..}

@覆蓋 公共布爾canConvert(類clazz所){..}

}

要知道是幹什麼用的轉換工具,利用的Marshaller參考this

所以基本上,轉換器在POJO上工作,並確保我們獲得合同中給出的XML響應。