我正在使用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,则需要返回原子样式的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>
如果请求的媒体类型是application / JSON,则需要返回OData的JSON格式,如下所示:
"d" : {
"results" : [
{
"__metadata": {
"uri" : "http://www.url.com/api/resource"
},
"title" : "reource name",
....
]}
}
我找到了有关设置实现MessageBodyWriter的提供程序的在线文档和示例。我可以为每种类型提供一个提供者。因此,产生注释将具有适当的媒体类型,并且isWriteable方法也将检查适当的类型。然后writeTo方法可以改变从资源返回的bean的格式,并在其周围包装正确的格式。但是,这是一个真正意图的独特提供商,是实现这三种可能回报的最佳方式吗?
我还在考虑只是添加到容器响应过滤器类我已经必须检查返回的媒体类型并相应地格式化它,但我担心过滤器可能变得“变大”,因为它对于过滤器做了太多,不确定这是否真的是一个问题。
我还可以在每个资源方法中处理构建bean并相应地对其进行格式化,但是它可以节省一次或三次唯一的时间,并将其应用于返回的每个bean。
哪个方向更好?还有其他选择可能比这两个更好吗?
谢谢!
答案 0 :(得分:0)
编写自己的MessageBodyWriter绝对是正确的方法,因为您具有与格式相关联的特定媒体类型,并且您希望以相同的方式处理对此类媒体类型的所有请求的序列化。