web-dev-qa-db-ja.com

Spring MVCコントローラーにSpring Dataプロジェクションを適用するにはどうすればよいですか?

データリポジトリメソッドを直接呼び出すときに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の事柄を、直接呼び出されるリポジトリメソッドに何らかの方法で渡すことができますか?

21
Barbadoss

いいえ、特に投影は通常、ケースバイケースでクエリ実行の結果に適用されるため、そうではありません。したがって、それらは現在、ドメインタイプに選択的に適用されるように設計されています。

最新のSpring Data Fowlerリリーストレイン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);
  }
}
_

最新リリースのPageには、ページコンテンツをオンザフライで変換するために使用できるmap(…)メソッドがどのように含まれているかを確認してください。 JDK 8ラムダを使用して、ProjectionFactoryを使用した変換ステップを提供します。

54
Oliver Drotbohm