データ リポジトリ メソッドを直接呼び出すときに指定することは可能ですか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
直接呼び出されるリポジトリ メソッドに何らかの方法で渡すことはできるのでしょうか?
ベストアンサー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);
}
}
最新リリースでは、ページ コンテンツをオンザフライで変換できるメソッドが提供されています。 を使用した変換手順を提供するために、JDK 8 ラムダを使用していPage
ます。map(…)
ProjectionFactory