2010-01-10 53 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响应。