Что лучше в JAX-RS / Джерси - с использованием containerResponseFilter или провайдера MessageBodyWriter? - PullRequest
2 голосов
/ 08 декабря 2011

Я работаю над API, используя Jersey Server. У меня есть общий корневой элемент, определенный в bean-компоненте, который я в настоящее время обертываю вокруг ответа от ресурса (другого bean-компонента), используя фильтр ответа контейнера. Работает отлично.

Это в основном возвращает это:

<transaction>
   <status>Good</status>
   <id>1</id>
   ....
</transaction>

Таким образом, он в основном оборачивает элемент транзакции и элемент состояния вокруг bean-компонента, возвращаемого ресурсом, который аннотируется аннотациями привязки javax.xml.

Мы смотрим на реализацию формата OData, который обеспечивает XML в стиле Atom и JSON. Оба на самом деле в другом формате. Таким образом, если тип носителя, который требуется вернуть, это application / xml, фильтр работает так же, как и сейчас. Если запрошенный тип мультимедиа - application / 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>

Если запрошенный тип мультимедиа - application / JSON, он должен вернуть JSON-формат OData, который выглядит примерно так:

"d" : {
  "results" : [
  {
    "__metadata": { 
      "uri" : "http://www.url.com/api/resource" 
    },
    "title" : "reource name",
    ....
  ]}
}

Я нашел онлайн-документацию и примеры по настройке провайдеров, реализующих MessageBodyWriter. У меня мог быть один поставщик для каждого типа. Таким образом, аннотация продукции будет иметь соответствующий тип носителя, а метод isWriteable будет также проверять соответствующий тип. Затем метод writeTo может изменить формат bean-компонента, возвращаемого ресурсом, и обернуть вокруг него правильный формат. Но является ли такой провайдер единственным намерением, и действительно ли это лучший способ достичь этих трех возможных результатов?

Я также думал о добавлении в класс фильтра ответа контейнера. Мне уже нужно проверить тип возвращаемого носителя и соответствующим образом отформатировать его, но я боюсь, что фильтр может быть «слишком большим», поскольку делает слишком много для фильтра, не уверен, что это действительно проблема.

Я мог бы также просто обработать создание и форматирование компонента в каждом методе ресурса, но это сэкономило бы время, чтобы сделать это один или три раза уникально, и применимо к каждому возвращаемому компоненту.

В каком направлении лучше? Есть ли другой вариант, который может быть даже лучше, чем эти два?

Спасибо!

1 Ответ

0 голосов
/ 10 декабря 2011

Написание собственного MessageBodyWriter - определенно правильный путь, если у вас есть определенный тип медиа, связанный с форматом, и вы хотите обрабатывать сериализацию всех запросов для такого типа медиа таким же образом.

...