2014-04-21 3 views
2

spring-data-rest-webmvc 2.0.0.RELEASE w/spring-data-jpa 1.5.0.RELEASE를 사용 중입니다.스프링 데이터 REST Override findBy * 메소드

저는 RoomRepository, RoomRepositoryCustom 및 RoomRepositoryImpl 클래스가 있습니다.

@PostFilter 작업을 수행 할 수있는 사용자 지정 논리를 제공 할 수 있도록 findBy * 메서드를 재정의하려고하지만 페이지가 매겨진 결과를 반환합니다.

나는 원래 RoomRespository이 있었다 :

@PostFilter("hasPermission(filterObject, '" + FIND + "')") 
@RestResource(rel = "byName", path = "byName") 
public List<Room> findByName(@Param("name") String name); 

그것은 잘 작동하지만, 때문에 나는 목록을 반환해야하고, 페이지를 반환 할 수 @PostFilter에 대한 제한에. 내가 좋아하는 것

는 다음과 같이 @PostFilter 페지 :

@RestResource(rel = "byName", path = "byName") 
public Page<Room> findByName(@Param("name") String name, Pageable p); 

하지만 난 여전히 인증 된 사용자의 교장이 내 결과를 필터링 할 필요가있다. (내가 원하는대로 사용자 지정 메서드에서 수행하기를 원했습니다.)

그래서 RoomRespositoryImpl에서 구현을 제공하여 findByName을 재정의 할 수 있지만 제대로 작동하지 않는 것으로 나타났습니다. findByName을 대체하려고 시도하면 스프링 데이터 REST가 더 이상 메소드를 선택하지 않고 rooms/search/byName?name="test"에 대한 엔드 포인트를 등록하지 않습니다.

또한 @Query를 사용하여 파인더에 대한 사용자 지정 쿼리를 정의하려고했습니다. 그것은 작동하지만 인증 된 사용자의 보안 주체를 쿼리 매개 변수로 사용해야하므로 내 용도로는 작동하지 않는다고 생각합니다.

요약 : 매개 변수가 포함 된 이름이있는 회의실의 페이지를 반환하는 Spring Data REST와 함께/rooms/search/byName? name = "test"끝점을 구현하는 가장 좋은 방법은 무엇입니까? 별도의 테이블에서 현재 인증 된 사용자의 권한을 조회하는 것을 기반으로하는 자체 사용자 정의 논리?

/rooms/search/* 아래에 맞춤 링크를 추가 할 수 있습니까?

답변

2

간단히 말해서, 현재 지원되지 않습니다 (버전 2.0/2.1). 페이지가로드 된 후 페이지에서 항목을 필터링하면 잘못된 결과가 생성 될 수 있기 때문에 @PostFilter 접근 방식이 실제로 작동하지 않으므로 보안에있어 페이지 매김은 꽤 복잡한 짐승입니다.

이 문제의 올바른 해결 방법은 실행 된 쿼리에 보안 제약 조건을 통합해야합니다. 우리는 스프링 데이터 커먼즈에 ticket을 가지고 이것에 필요한 일반적인 인프라를 추적 할 수있을뿐만 아니라 스프링 데이터 JPA의 소프트 삭제 지원에 대한 어떤 식 으로든 관련 one과 관련하여 해당 항목의 진행 상황을 추적 할 수 있습니다.

+0

페이지 매김 된 결과를 필터링하는 것이 어려운 사업으로 보입니다. findBy * 형식 메서드에 대한 사용자 지정 구현을 제공하고 SDR에서 엔터티의 루트 URL을 검색하거나 검색하도록 할 수 있습니까? 나는 페이지 매김을 수행하고 쿼리를 필터링 할 수 있지만 일관성을 유지하고 동일한 엔터티에 대해 내 검색 방법을 노출하고 싶습니다. –

+1

동시에 둘 모두가 아닙니다. 사용자 정의 구현을 작성하는 것은 옵션이지만 사용자 정의 구현의 멱등 원성에 대해서는 판단 할 수 없으므로 자동으로 검색 리소스를 노출하지는 않습니다. 하지만 동일한 URI 공간에 블렌드하는 컨트롤러를 수동으로 코딩 할 수 있어야합니다. –

관련 문제