Spring Data Rest без HATEOAS

Мне действительно нравится весь шаблонный код, который Spring Data Rest пишет для вас, но я бы предпочел просто «обычный?» REST-сервер без всего этого HATEOAS. Основная причина в том, что я использую Dojo Toolkit на стороне клиента, и все его виджеты и хранилища настроены таким образом, что возвращаемый json представляет собой простой массив элементов без всех ссылок и тому подобного. Кто-нибудь знает, как настроить это с помощью конфигурации java, чтобы я получил весь код mvc, написанный для меня, но без всего материала HATEOAS?


person Matt    schedule 26.06.2014    source источник
comment
Разве вы не можете сопоставить ответ REST с желаемым форматом? (поздний комментарий: D)   -  person Helder AC    schedule 11.03.2021


Ответы (2)


После прочтения комментария Оливера (с которым я согласен) вы все еще хотите удалить HATEOAS из весенней загрузки.

Добавьте это выше объявления класса, содержащего ваш основной метод:

@SpringBootApplication(exclude = RepositoryRestMvcAutoConfiguration.class)

Как указал Зак в комментариях, вам также необходимо создать контроллер, который предоставляет необходимые методы REST (findAll, save, findById и т. Д.).

person Megadec    schedule 06.10.2016
comment
Это полностью останавливает SDR. - person Adam; 04.01.2017
comment
Это должен быть принятый ответ. В дополнение к этой аннотации вам необходимо создать контроллер, который предоставляет необходимые методы REST (findAll, save, findById и т. Д.). - person Zack; 06.08.2018
comment
Получив за это довольно много отрицательных голосов, может ли кто-нибудь объяснить, в чем заключаются его проблемы после добавления этой аннотации и создания своих методов REST вручную, задаваясь вопросом, устарело ли это сейчас или люди читают только половину ответа. - person Megadec; 16.12.2020

Итак, вы хотите REST без того, что составляет REST? :) Я думаю, что пытаться изменить (читай: тупой) сервер RESTful для удовлетворения плохо спроектированной клиентской библиотеки - плохое начало. Но вот обоснование того, почему элементы гипермедиа необходимы для такого рода инструментов (помимо, вероятно, знакомого общее обоснование).

Предоставление доступа к объектам домена в Интернете всегда критически воспринималось большинством REST-сообщества. В основном по той причине, что границы объекта домена не обязательно являются границами, которые вы хотите предоставить своим ресурсам. Однако в последние пару лет фреймворки, обеспечивающие функциональные возможности каркаса (Rails, Grails и т. Д.), Стали чрезвычайно популярными. Итак, Spring Data REST пытается решить эту проблему, но в то же время быть хорошим гражданином с точки зрения спокойствия.

Итак, если вы в первую очередь начнете с простой модели данных (объекты без многих связей), хотите только их прочитать, на самом деле нет необходимости в чем-то вроде Spring Data REST. Контроллер Spring, который вам нужно написать, представляет собой примерно 10 строк кода поверх репозитория Spring Data. Когда все становится сложнее, история становится еще интереснее:

  • Как написать клиента без жесткого кодирования URI (если да, то это не особо успокаивало)?
  • Как вы справляетесь с отношениями между ресурсами? Как вы позволяете клиентам создавать их, обновлять и т. Д.?
  • Как клиент обнаруживает, какие ресурсы запроса доступны? Как он узнает о передаваемых параметрах и т. Д.?

Если вы ответите на эти вопросы: «Моему клиенту это не нужно / он не способен на это», то Spring Data REST, вероятно, для начала неправильная библиотека. То, что вы в основном создаете, - это JSON через HTTP, но тогда ничего действительно успокаивающего. Это совершенно нормально, если это служит вашей цели, но использование библиотеки с четкими ограничениями дизайна во что-то произвольно отличающееся (хотя и внешне похожее), которое эффективно игнорирует именно эти аспекты дизайна, - это, в первую очередь, неправильный подход.

person Oliver Drotbohm    schedule 27.06.2014
comment
Я хотел бы использовать HATEOAS на бэкэнде, но у меня проблемы с пониманием того, как (или даже если) это будет работать для чего-то вроде одностраничного javascript webapp. SDR был привлекательным, поскольку он автоматически генерировал контроллеры, обрабатывал разбиение на страницы / сортировку и все такое, тогда как с JSON через HTTP, как вы его описали, мне придется написать кучу контроллеров, которые переводят такие вещи, как заголовки диапазона контента и параметры запроса, в вещи, которые может понять репозиторий Spring Data. - person Matt; 27.06.2014
comment
На самом деле вся моя точка зрения такова: сервер просто выполняет достойный REST. Если это ломает клиента, нужно исправить (настроить) именно его. Таким образом, аспект гипермедиа является фундаментальным для Spring Data REST, и мы не собираемся отказываться от него. Это, вероятно, не удовлетворительно в вашей конкретной ситуации, но, по крайней мере, должно ответить на вопрос :). - person Oliver Drotbohm; 27.06.2014
comment
Это довольно неудовлетворительно, но да, вы ответили на мой вопрос. - person Matt; 27.06.2014
comment
Если вы ищете пример JS-приложения, работающего поверх Spring Data Rest, проверьте github. ru / gregturn / приложение-диспетчер задач. Он имеет Spring Data Rest, Spring Boot и даже настраиваемую конечную точку Spring MVC, обслуживающую угловой интерфейс, прекрасно работающий с гипермедиа. - person gregturn; 08.07.2014
comment
@gregturn: вы понимаете, что в вашем образце НЕ используется HATEOS, а вместо этого используются жестко заданные ссылки? ))) - person Vadim Ferderer; 26.06.2015
comment
Да, но это потому, что angular был написан кем-то другим, который сосредоточил ОЧЕНЬ много усилий на создании контроллеров для обработки всех операций. Я пытался продемонстрировать (в этом случае), как SDR может уменьшить вашу кодовую базу. Моя основная демонстрация всего, что использует гипермедиа для навигации, можно найти по адресу github.com/gregturn/spring-a -грамма. Возможно, мне следовало привести этот пример. :) - person gregturn; 27.06.2015
comment
Что насчет таких вещей, как ресурсы AngularJS $. Команда Angular прямо говорит об этом ($ resource - это) фабрика, которая создает объект ресурса, который позволяет вам взаимодействовать с источниками данных на стороне сервера RESTful. Ирония в том, что HAL на самом деле портит способ действия ресурсов Angular $ и заставляет их плохо работать. - person pasquers; 11.11.2016
comment
Итак, вы приравниваете HAL к REST, честно говоря, меня очень сбивает с толку - person pasquers; 11.11.2016
comment
Что бы Angular ни считал ресурсом, это проблема Angular. Если они считают ресурс источником данных на стороне сервера, это нормально. Это просто не ОТДЫХ. А серверная библиотека называется Spring Data REST, а не Spring Data Backend для Angular;). Так что у вас могут возникнуть проблемы, если ваша клиентская библиотека принципиально нарушает принципы REST. Тем не менее, я слышал о довольно многих реализациях внешнего интерфейса на основе Angular, которые используют SDR в качестве внутреннего интерфейса, так что это не кажется принципиально невозможным. - person Oliver Drotbohm; 12.11.2016
comment
Вопрос не в том, зачем мне использовать HATEOAS? Вопрос в том, зачем мне использовать эту реализацию? У моей компании было множество проблем с этим, и это вещь №1, о которой мы беспокоимся, когда дело касается Spring. - person gshauger; 07.12.2016
comment
Я не уверен, что понял суть. Если конструктивные ограничения, которые Spring Data REST накладывает на ваш дизайн API, не соответствуют тому, что вы хотите, не используйте его. Все просто. Если вы не используете гипермедиа, вы отбрасываете одну из определяющих характеристик REST и, следовательно, выгоды, которые вы получаете от него. Это нормально, вы просто больше не создаете REST API и не можете ожидать, что технология, которая хочет сосредоточиться на этом, согласовать. - person Oliver Drotbohm; 07.12.2016
comment
Поразмыслив, я пришел к выводу, что авторы SDR здесь чрезмерно догматичны. Используя метафору, это немного похоже на ситуацию, когда они производят радиоуправляемую лопату, и они не будут создавать механизм, позволяющий пользователям снимать радиоантенну, даже если пользователи жалуются, что антенна действительно попадает в способ, когда они активно используют его без радиоуправления. К сожалению, метафора не работает, если вы предлагаете пользователям просто использовать другую лопату для ручной работы. С веб-сервисами это действительно не так просто. - person Adam; 04.01.2017
comment
Следует отметить, что можно легко заставить SDR создавать ответы application / json по умолчанию (а не HAL). Полученный JSON по-прежнему содержит ссылки, но помимо этого структура намного ближе к тому, что некоторые люди (и инструменты) могут ожидать от простого JSON. - person Matthias; 18.05.2017
comment
REST не означает HATEOAS или гипермедиа. Это подход к определению ответственности за рендеринг данных из необработанного источника, и в основном это все. Даже JSON не предполагается, если следовать REST :) - person Maksim Gumerov; 14.02.2018
comment
@altu - roy.gbiv.com/untangled/2008 / rest-apis-must-be-hypertext-driven - person Oliver Drotbohm; 25.01.2020
comment
И я покажу вам сообщение в блоге, что я собираюсь написать, как данные и метаданные не должны возвращаться с одним и тем же ответом. HATEOAS - это пустая трата трафика и ресурсов как на стороне клиента, так и на стороне сервера. Связанные объекты, управляемые с помощью ORM, предназначены для рендеринга на стороне сервера (программы | веб-сайты | приложения). Гипермедиа - это парадигма SSR, применяемая к приложениям CSR. Вы ошибаетесь, вы просто недостаточно мужчина, чтобы признать это. От конечной точки будет возвращено столько информации, сколько возможно, и столько информации, сколько необходимо. Если бы решением была Hypermedia, то сейчас она стала бы отраслевым стандартом. Вместо этого это RESTful & grpc. - person ; 25.01.2020
comment
И я должен добавить, что я не хочу обидеться, даже если это можно было бы читать как таковое. Такой популярный и производительный фреймворк, как Spring Boot, лишает возможности Hypermedia. Гипермедиа - это не норма. Это одно, что вы предлагаете и настаиваете на том, чтобы игнорировать любой другой вариант, если он вам не нравится, не используйте его. Хорошо, я не буду использовать это. Я продолжу использовать свой генератор, написанный на Go, который совместим с @ ngrx / data, чтобы избавить себя от головной боли и некоторых ресурсов. - person ; 25.01.2020