spring-data-rest: возможно ли динамически встраивать отношения ресурса в один ответ?
Можно ли в весенний период отдыха данных встраивать данные для отношений первичного ресурса в ответ HAL?
Причина в том, что в некоторых случаях клиент знает, что ему понадобится Child
ресурс и School
а также Pets
отношения сразу.
С помощью ссылок эту информацию можно запросить в n запросах, но в идеале это можно было бы сделать в 1.
Примечание: глубина n-уровней была бы хорошей (JSON-API поддерживает это), но на данный момент достаточно даже уровня 1.
Это очевидно возможно в соответствии со спецификацией HAL и даже возможно при использовании простых пружинных хатео (см. Этот пример).
- Возможно ли это каким-либо образом с пружинным отдыхом?
- Это возможно без большого количества кода котельной пластины и по существу переписывания битов SDR?
Если так, как это делается? Примеры будут приветствоваться.
Обратите внимание, что ВСЕ рассматриваемые ресурсы должны быть ресурсами верхнего уровня, поэтому не стоит использовать @RestResource(exported = false)
и вставив их в строку, как того требует Оливер.
1 ответ
Вы можете определить проекцию, которая будет встраивать данные ассоциации:
Увидеть:
http://docs.spring.io/spring-data/rest/docs/current/reference/html/
8.3. Извлечение часто используемых данных Распространенная ситуация со службами REST возникает при создании объектов домена. Например, Person хранится в одной таблице, а соответствующий ему адрес хранится в другой. По умолчанию Spring Data REST обслуживает адрес человека в качестве URI, по которому должен перемещаться клиент. Но если для потребителей характерно всегда извлекать этот дополнительный фрагмент данных, проекция выдержки может пойти дальше и вставить этот дополнительный фрагмент данных, сэкономив вам дополнительный GET
@Projection(name = "withAssociations", types = { MyEntity.class })
public interface WithAssocationsProjection{
//method names match the getter methods in the corresponding Entity
List<School> getSchools();
List<Pet> getPets();
//you can also in-line a subset of data or have a further level
//of data in-lined for the association by
//specifying a further projection as the Collection Type.
List<ChildProjection> getChildren();
}
Затем клиенты могут запросить конкретное представление данных, например:
http://localhost:9090/api/myEntities?projection=withAssociations
HTTP: // локальный: 9090 / API / myEntities / 123 проекции = withAssociations