Разоблачение ссылки на объект коллекции в весенних данных REST

Используя весенние данные REST, я представил ProjectRepository, который поддерживает перечисление проектов и выполнение над ними операций CRUD. Когда я перехожу к http://localhost:8080/projects/, я получаю список проектов, как и ожидал.

Я пытаюсь добавить пользовательское действие в раздел _links ответа JSON для коллекции проектов.

Например, я бы хотел, чтобы вызов http://localhost:8080/projects/ возвращал что-то вроде этого:

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/projects/{?page,size,sort}",
      "templated" : true
    },
    "search" : {
      "href" : "http://localhost:8080/projects/search"
    },
    "customAction" : {
       "href" : "http://localhost:8080/projects/customAction"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 0,
    "totalPages" : 0,
    "number" : 0
  }
}

Где customAction определяется в каком-то контроллере.

Я попытался создать следующий класс:

public class ProjectCollectionResourceProcessor implements ResourceProcessor<Resource<Collection<Project>>> {

    @Override
    public Resource<Collection<Project>> process(Resource<Collection<Project>> listResource) {
        // code to add the links to customAction here
        return listResource;
    }

}

и добавив следующий Bean в конфигурацию моих приложений:

@Bean
public ProjectCollectionResourceProcessor projectCollectionResourceProcessor() {
    return new ProjectCollectionResourceProcessor();
}

Но process(...), кажется, никогда не звонили. Как правильно добавлять ссылки на Коллекции ресурсов?


person thorben.jakobsen    schedule 17.06.2014    source источник
comment
См. также этот вопрос: stackoverflow.com/q/40156413   -  person Wallace Brown    schedule 16.03.2017


Ответы (2)


Ресурсы коллекции отображают экземпляр Resources<Resource<Project>>, а не Resource<Collection<Project>>. Поэтому, если вы соответствующим образом измените общую типизацию в своей реализации ResourceProcessor, это должно работать так, как вы ожидаете.

person Oliver Drotbohm    schedule 18.06.2014
comment
добавление кода ниже не помогло public class ProjectsResourceProcessor implements ResourceProcessor<Resources<Project>> { @Autowired private EntityLinks entityLinks; @Override public Resources<Project> process(Resources<Project> resources) { resources.add(entityLinks.linkFor(Project.class).slash("custom") .withRel("custom")); return resources; } } Использование SDR-2.1.0.RELEASE - person Stackee007; 18.06.2014
comment
Чтобы заставить его работать, мне пришлось реализовать ResourceProcessor<PagedResources> и в коде определить, был ли это ресурс Project. Спасибо за помощь. - person thorben.jakobsen; 19.06.2014
comment
@thorben.jakobsen Я ищу некоторые ресурсы (учебные :-) для реализации вашего решения. У меня также есть выгружаемый ресурс. - person Stephane; 19.08.2014
comment
@thorben.jakobsen Интересно, как бы выглядела ваша ссылка на конечную точку поиска, если бы она предлагала разбиение на страницы. - person Stephane; 19.08.2014
comment
@thorben.jakobsen Как вам удалось выполнить проверку типов? У вас есть общий способ поделиться с другими? - person RJo; 07.10.2014
comment
Это не работает, ResourceProcessor‹Resources‹User›› не будет вызываться для моего выгружаемого совокупного корня /users - person szxnyc; 12.01.2018

Я была такая же проблема. Что сработало для меня:

public class ProjectsResourceProcessor implements ResourceProcessor<PagedResources<Resource<Project>>> {

    private final @NonNull EntityLinks entityLinks;

    @Override
    public PagedResources<Resource<Project>> process(PagedResources<Resource<Project>> pagedResources) {

       ...

        return pagedResources;
    }
}
person Goran Gloncak    schedule 06.11.2014
comment
когда проекта нет, ссылки не появляются :'( - person Kakawait; 18.04.2015
comment
В ResourcesProcessorWrapper::isValueTypeMatch есть явная проверка на наличие пустого содержимого, что предотвращает срабатывание обработчика ресурсов. - person Faisal Feroz; 05.12.2015
comment
да, столкнулся с той же проблемой .. любой хак, чтобы преодолеть это - person Gaurav Rawat; 20.01.2016