Я в процессе оценки Spring REST как сервер для приложения на основе AngularJS. Я быстро смоделировал наш домен как набор агрегатных корней и ударил следующий дизайн блокпост:Обработка ссылок ресурсов в сборе сущностей с Spring Data REST
- Модель Ресурс имеет
- Множественных Задачи Entities
- ссылающееся множественный Attribute Ресурсы
Я ожидал, что HAL _links для атрибутов plac внутри каждого объекта задачи JSON, но, к сожалению, атрибуты видны только как ссылка в корневой части конструкции JSON.
E.g. Я получаю это:
{
"version": 0,
"name": "myModel",
"tasks": [
{
"name": "task1"
},
{
"name": "task2"
}
],
"_links": {
"self": {
"href": "http://localhost:8080/models/1"
},
"attributes": {
"href": "http://localhost:8080/models/1/attributes"
}
}
}
Вместо того, чтобы что-то я бы образ может быть как:
{
"version": 0,
"name": "myModel",
"tasks": [
{
"name": "task1",
"_links": {
"attributes": {
"href": "http://localhost:8080/models/1/tasks/1/attributes"
}
}
},
{
"name": "task2",
"_links": {
"attributes": {
"href": "http://localhost:8080/models/1/tasks/2/attributes"
}
}
],
"_links": {
"self": {
"href": "http://localhost:8080/models/1"
},
"attributes": {
"href": "http://localhost:8080/models/1/attributes"
}
}
}
Кстати, в первом примере, атрибуты ссылка оканчивается на 404.
I ничего не видели в спецификации HAL для обработки подобных случаев или в документации Spring REST. Очевидно, я мог бы определить задачу как ресурс для решения этой проблемы, однако моя модель не требует этого. Я чувствую, что это законный прецедент.
Я создал простое приложение Spring Boot, которое воспроизводит эту проблему. Модели:
@Entity
public class Model {
@Id @GeneratedValue public Long id;
@Version public Long version;
public String name;
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
public List<Task> tasks;
}
@Entity
public class Task {
@Id @GeneratedValue public Long id;
public String name;
@ManyToMany
public Set<Attribute> attributes;
}
@Entity
public class Attribute {
@Id @GeneratedValue public Long id;
@Version public Long version;
public String name;
}
И хранилищами:
@RepositoryRestResource
public interface ModelRepository extends PagingAndSortingRepository<Model, Long> {
}
@RepositoryRestResource
public interface AttributeRepository extends PagingAndSortingRepository<Attribute,Long> {
}
Там, возможно, я пропустил что-то, как это кажется довольно простой вариант использования, но не мог найти кого-нибудь с подобной проблемой на SO. Кроме того, возможно, это фундаментальный недостаток в моей модели, и, если это так, я готов услышать ваши аргументы :-)
Привет Mathias, спасибо за ваш ответ. На самом деле у моих задач нет репозитория по дизайну. Они не являются ресурсами и могут рассматриваться как объекты ценности. Моя проблема состоит в том, что два внутренних объекта ссылаются на разные наборы одинаковых ресурсов и могут различать соответствующие ссылки. –
Думаю, у меня есть твоя проблема. Если вы хотите, чтобы такая ссылка «http: // localhost: 8080/models/1/tasks/2/attributes» должна быть ресурсом, потому что атрибуты были бы подресурсом задачи и, следовательно, репозиторий. По крайней мере, если вы не хотите настраивать метод контроллера. Вы можете попробовать собственный метод контроллера, который обрабатывает «модели/1/tasks/2/attributes», тогда вы можете попытаться реализовать «ResourceProcessor» и вручную добавить ссылки на этот метод контроллера в ResourceProcessor. Не уверен, что это сработает - но стоит попробовать. –
Да, я пришел к такому же выводу, как и к тому, чтобы реализовать то, что мне нужно, поскольку, похоже, это не так. Я буду экспериментировать и вернуться сюда с моими выводами, спасибо. –