2016-10-31 2 views
1

스프링 데이터 나머지 저장소는 사용자 정의 링크는 다음과 같은 엔티티에 추가 할 수 있다고 지적 :봄 데이터 나머지 사용자 정의 링크

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을 반환합니다.

투영 정의, ID가있는 클래스 등의 기타 데이터가 삽입 된 RepositoryRestConfiguration에 예상대로 존재합니다. 그렇다면이 룩업에 대해 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; 
    } 
} 

그러나 (I가 사용되지 않는 코드가 작동 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; 
    } 
} 
관련 문제