Подтвердить что ты не робот

Как применять Spring Прогнозы данных в контроллерах MVC Spring?

Можно ли указать projection при непосредственном вызове метода репозитория данных? Здесь код репозитория - заметьте, что я не хотел бы показывать его через 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);
}

Можно ли указать метод projection для findEmployeeUsers, когда он вызывается непосредственно, как указано выше?

Я понимаю, что вышеприведенный код может показаться странным для кого-то... можно было бы открыть репозиторий через REST и поместить объект @PreAuthorize в репозиторий. Контроллер мышления - это более подходящее место для проверок безопасности - это более естественно, а также проще проверить.

Итак, может ли projection вещь каким-то образом передаваться непосредственно в метод репозитория?

4b9b3361

Ответ 1

Нет, нет, особенно, поскольку прогнозы обычно применяются к результату выполнения запроса в каждом конкретном случае. Таким образом, они в настоящее время предназначены для выборочного применения к типам доменов.

По состоянию на последний выпуск Spring сборника данных Data Fowler GA релиз проекционной инфраструктуры может использоваться программно в контроллерах Spring MVC. Просто объявите Spring bean для SpelAwareProxyProjectionFactory:

@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);
  }
}

Посмотрите, как на последней версии Page есть метод map(…), который можно использовать для преобразования содержимого страницы на лету. Мы используем лямбда JDK 8 для предоставления шага преобразования с помощью ProjectionFactory.