データリポジトリメソッドを直接呼び出すときに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
の事柄を、直接呼び出されるリポジトリメソッドに何らかの方法で渡すことができますか?
いいえ、特に投影は通常、ケースバイケースでクエリ実行の結果に適用されるため、そうではありません。したがって、それらは現在、ドメインタイプに選択的に適用されるように設計されています。
最新の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
を使用した変換ステップを提供します。