2016-10-31 4 views
1
хранилище

Весна данных Rest отмечает, что Пользовательские ссылки могут быть добавлены к объекту, как показано ниже:Spring Data Rest Пользовательские ссылки на ресурс

http://docs.spring.io/spring-data/rest/docs/current/reference/html/#_the_resourceprocessor_interface

Пример Дано:

@Bean 
public ResourceProcessor<Resource<Person>> personProcessor() { 

    return new ResourceProcessor<Resource<Person>>() { 

    @Override 
    public Resource<Person> process(Resource<Person> resource) { 

     resource.add(new Link("http://localhost:8080/people", "added-link")); 
     return resource; 
    } 
    }; 
} 

Очевидно жесткое кодирование плохо, так как я могу написать такой компонент, который может динамически получить путь для другого ресурса в приложении?

Очевидным решением, казалось бы, было бы добавить экземпляр RepositoryRestConfiguration, однако все поисковые запросы в этой области на вложенной конфигурации возвращают null, даже если репозиторий открыт и работает для этого ресурса.

Другие данные, такие как определения проецирования, классы с идентификаторами и т. Д., Присутствуют в введенной репозиторииRestConfiguration, как ожидалось. Итак, почему я получаю null для этих поисков?

@Component 
public class CaseResourceProcessor implements ResourceProcessor<Resource<Case>> 
{ 
    @Autowired 
    private RepositoryRestConfiguration configuration; 

    @Override 
    public Resource<Case> process(Resource<Case> resource) 
    { 
    //null 
    configuration.getResourceMappingForDomainType(Submission.class).getPath(); 

    //null 
    configuration.getResourceMappingForRepository(SubmissionRepository.class).getPath(); 

    resource.add(new Link("....")); 

    return resource; 
    } 
} 

Большая часть кода в этой области является устаревшим, однако это не совсем ясно, что следует использовать вместо (хотя я бы ожидать, что устаревший код rmain функционал).

По существу, как я программно обнаруживаю URL-адрес для определенного объекта или репозитория.

ответ

2

Найдено, что это может быть сделано следующим образом:

@Component 
public class CaseResourceProcessor implements ResourceProcessor<Resource<Case>> 
{ 
    @Autowired 
    private RepositoryRestMvcConfiguration configuration; 

    @Override 
    public Resource<Case> process(Resource<Case> resource) 
    { 
    LinkBuilder link = configuration.entityLinks().linkForSingleResource(Submission.class, 
     resource.getContent().getLatestSubmission().getId()); 

    resource.add(link.withRel("latestSubmission")); 

    return resource; 
    } 
} 
Смежные вопросы