【问题标题】:What's better in JAX-RS/Jersey - using a containerResponseFilter or a MessageBodyWriter Provider?在 JAX-RS/Jersey 中有什么更好的 - 使用 containerResponseFilter 或 MessageBodyWriter 提供程序?
【发布时间】: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。

哪个方向更好?还有比这两个更好的选择吗?

谢谢!

【问题讨论】:

    标签: jaxb jersey odata jax-rs


    【解决方案1】:

    编写自己的 MessageBodyWriter 绝对是正确的方法,因为您有一个与格式相关联的特定媒体类型,并且您希望以相同的方式处理对此类媒体类型的所有请求的序列化。

    【讨论】:

    • 这就是我的想法 - 有道理。目前在过滤器中,我有一组带注释的 bean。在 writeTo 方法中,我正在处理流,所以我不一定要设置 bean,而只是添加到流中 - 我很担心这一点。我错了吗?我能否在 MessageBodyWriter 中拥有与过滤器中相同的功能,只是在输出时将其流式传输?
    猜你喜欢
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2018-01-10
    • 2019-03-14
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多