【发布时间】:2011-12-08 03:43:41
【问题描述】:
我正在使用 Jersey Server 开发 API。我在一个 bean 中定义了一个公共根元素,我目前使用容器响应过滤器将来自资源(另一个 bean)的响应包装起来。它工作得很好。
它基本上返回这个:
<transaction>
<status>Good</status>
<id>1</id>
....
</transaction>
因此它基本上将事务元素和状态元素包装在从资源返回的 bean 周围,并使用 javax.xml 绑定注释进行注释。
我们正在研究实现 OData 格式,它提供 Atom 样式的 XML 和 JSON。两者的格式确实不同。因此,如果请求返回的媒体类型是 application/xml,则过滤器会像现在一样工作。如果请求的媒体类型是application/atom+xml,则需要返回一个atom风格的xml文档。
<feed xlmns="http://www.w3.org/2005/Atom"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
<title>resource name</title>
.....
</feed>
如果请求的媒体类型是应用程序/JSON,则需要返回 OData 的 JSON 格式,如下所示:
"d" : {
"results" : [
{
"__metadata": {
"uri" : "http://www.url.com/api/resource"
},
"title" : "reource name",
....
]}
}
我找到了有关设置实现 MessageBodyWriter 的提供程序的在线文档和示例。我可以为每种类型设置一个提供者。因此,produces 注释将具有适当的媒体类型,并且 isWriteable 方法还将检查适当的类型。然后 writeTo 方法可以改变从资源返回的 bean 的格式,并将正确的格式包装在它周围。但是,像这样的独特供应商真的是意图吗?这是实现这三种可能回报的最佳方式吗?
我还考虑只添加到容器响应过滤器类中,我已经必须检查返回的媒体类型并相应地对其进行格式化,但我担心过滤器可能会变得“太大”,因为它为过滤器做了太多,不确定这是否真的是一个问题。
我也可以只处理构建 bean 并在每个资源方法中相应地对其进行格式化,但是这样做会节省时间一次,或者三遍,并将其应用于返回的每个 bean。
哪个方向更好?还有比这两个更好的选择吗?
谢谢!
【问题讨论】: