Я работаю над 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-компонента, возвращаемого ресурсом, и обернуть вокруг него правильный формат. Но является ли такой провайдер единственным намерением, и действительно ли это лучший способ достичь этих трех возможных результатов?
Я также думал о добавлении в класс фильтра ответа контейнера. Мне уже нужно проверить тип возвращаемого носителя и соответствующим образом отформатировать его, но я боюсь, что фильтр может быть «слишком большим», поскольку делает слишком много для фильтра, не уверен, что это действительно проблема.
Я мог бы также просто обработать создание и форматирование компонента в каждом методе ресурса, но это сэкономило бы время, чтобы сделать это один или три раза уникально, и применимо к каждому возвращаемому компоненту.
В каком направлении лучше? Есть ли другой вариант, который может быть даже лучше, чем эти два?
Спасибо!