Интеграция Spring Data Rest с Spring HATEOAS

Из различных документов и уроков я заработал и узнал следующие моменты:

  1. Spring Data Rest (SDR) используется для предоставления нашего репозитория данных Spring в качестве службы REST, чтобы его можно было использовать для самостоятельного изучения без необходимости создания JAXRS вручную. Он работает только для уровня репозитория, и мы не можем контролировать способ его работы с точки зрения модификации или добавления, кроме конфигурации с использованием RepositoryRestMvcConfiguration. Он использует Spring HATEOAS где-то внутри.

  2. Spring HATEOAS создан для создания ссылок внутри сущностей, которые мы возвращаем через контроллер или конечные точки REST. У нас есть ResourceSupport, чтобы расширить нашу сущность, или Resource класс-оболочку, чтобы обернуть нашу сущность для создания или добавления ссылок. Существует несколько аннотаций и классов, таких как @EnableHyperediaSupport и EntityLinks.

Могут быть некоторые моменты, которые мне еще предстоит изучить или узнать, но мне просто было любопытно, Как мы можем объединить SDR в процесс построения ссылок HATEOAS? Скажем, например.

EntityBean bean = repository.findByName(name);
Resource<EntityBean> resource = new Resource<EntityBean>(bean);
//JaxRsLinkBuilder.linkTo(TestResource.class).withRel("entity")     // this also works   
//ControllerLinkBuilder.linkTo(TestResource.class).withRel("myRel") // this also works
// I am curious how ControllerLinkBuilder and JaxRSLinkBuilder both are working for JaxRS.  
//Here TestResource is my REST service class. now in below line: 
resource.add(JaxRsLinkBuilder.linkTo(MyRepository.class).withRel("sdf")); //not working
// MyRepository is SDR exposed repository, which I thought should work but not working.
return resource;  

Итак, я просто хотел включить мой открытый репозиторий REST в ручной процесс создания ссылок HATEOAS. Возможно ли это сделать?


person agpt    schedule 16.05.2014    source источник


Ответы (1)


Вы должны иметь возможность использовать Spring-HATEOAS ResourceProcessor для сборки ссылки.

Пример:

@Component
public class MyBeanResourceProcessor implements ResourceProcessor<Resource<MyBean>> {

    @Autowired
    private EntityLinks entityLinks;

    public Resource<MyBean> process(Resource<MyBean> resource) {
        MyBean mybean = resource.getContent();

        // Do your linking here using entity class
        //EntityBean bean = repository.findByName(name);
        //Resource<EntityBean> resource = new Resource<EntityBean>(bean);
        // assuming you are linking to a single resource and bean.getId() method... check entitylinks for other methods
        //resource.add(entityLinks.linkForSingleResource(bean.class,bean.getId()).withRel("sdf"));

        return resource;
    }

}
person Stackee007    schedule 21.05.2014
comment
Чтобы уточнить решение здесь, которое является правильным. Вы хотите сделать противоположное тому, что вы просите. Это значит, что вы не включаете spring-data-rest в хейто, скорее, spring-data-rest уже включает хейто. Поэтому используйте spring-data-rest, а затем определите собственный процессор ресурсов hatos, который будет использовать spring-data-rest. - person dan carter; 23.07.2014