복붙노트

[SPRING] Spring MVC 컨트롤러에서 Spring 데이터 투영을 적용하는 방법은 무엇입니까?

SPRING

Spring MVC 컨트롤러에서 Spring 데이터 투영을 적용하는 방법은 무엇입니까?

데이터 저장소 메서드를 직접 호출 할 때 투영을 지정할 수 있습니까? 저장소 코드 - REST를 통해 공개하고 싶지 않은 대신 서비스 또는 컨트롤러에서 호출 할 수 있기를 바랍니다.

@RepositoryRestResource(exported = false)
public interface UsersRepository extends PagingAndSortingRepository<User, Long> {

    @Query(value = "SELECT u FROM User u WHERE ....")
    public Page<User> findEmployeeUsers(Pageable p);
}

그런 다음 컨트롤러에서이 작업을 수행합니다.

@PreAuthorize(value = "hasRole('ROLE_ADMIN')")
@RequestMapping(value = "/users/employee")
public Page<User> listEmployees(Pageable pageable) {
    return usersRepository.findEmployeeUsers(pageable);
}

위와 같이 직접 호출 할 때 findEmployeeUsers 메소드의 투영을 지정하는 방법이 있습니까?

위의 코드가 누군가를 위해 이상하게 보일 수 있다는 것을 알았습니다 ... REST를 통해 저장소를 노출하고 @PreAuthorize 것을 저장소에 넣을 수 있습니다. 생각 컨트롤러는 보안 검사를 수행하기에 더 적합한 장소입니다. 테스트하기가 더 자연스럽고 간단합니다.

그래서 프로젝션은 어떻게 든 직접 호출 된 저장소 메소드로 전달 될 수 있습니까?

해결법

  1. ==============================

    1.아니요. 특히 대개 투영이 대개의 경우 쿼리 실행 결과에 적용되므로 특히 그렇습니다. 따라서 현재 도메인 유형에 선택적으로 적용되도록 설계되었습니다.

    아니요. 특히 대개 투영이 대개의 경우 쿼리 실행 결과에 적용되므로 특히 그렇습니다. 따라서 현재 도메인 유형에 선택적으로 적용되도록 설계되었습니다.

    최신 Spring Data Fowler 릴리스 Train GA 릴리즈부터는 프로젝션 인프라를 Spring MVC 컨트롤러에서 프로그래밍 방식으로 사용할 수 있습니다. SpelAwareProxyProjectionFactory에 대한 Spring bean을 선언하기 만하면됩니다.

    @Configuration
    class SomeConfig {
    
      @Bean
      public SpelAwareProxyProjectionFactory projectionFactory() {
        return new SpelAwareProxyProjectionFactory();
      }
    }
    

    그런 다음 컨트롤러에 주입하여 사용하십시오.

    @Controller
    class SampleController {
    
      private final ProjectionFactory projectionFactory;
    
      @Autowired
      public SampleController(ProjectionFactory projectionFactory) {
        this.projectionFactory = projectionFactory;
      }
    
      @PreAuthorize(value = "hasRole('ROLE_ADMIN')")
      @RequestMapping(value = "/users/employee")
      public Page<?> listEmployees(Pageable pageable) {
    
        return usersRepository.findEmployeeUsers(pageable).//
          map(user -> projectionFactory.createProjection(Projection.class, user);
      }
    }
    

    최신 릴리스 페이지에서 페이지 콘텐츠를 즉시 변환하는 데 사용할 수있는지도 (...) 메소드가있는 방법을 확인하십시오. ProjectionFactory를 사용하여 변환 단계를 제공하기 위해 JDK 8 람다를 사용합니다.

  2. from https://stackoverflow.com/questions/29376090/how-to-apply-spring-data-projections-in-a-spring-mvc-controllers by cc-by-sa and MIT license