projection直接调用数据存储库方法时是否可以指定?这是存储库代码-请注意,我不想通过REST公开它,而是希望能够从服务或控制器中调用它:
projection
@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,当它被称为直接像上面的方法?
findEmployeeUsers
我意识到上面的代码对于某些人来说可能看起来很奇怪…可以通过REST公开存储库并将其放入@PreAuthorize存储库中。Thought Controller是进行安全检查的更正确的地方-它更自然也更容易测试。
那么,projection事情可以以某种方式传递到直接调用的存储库方法中吗?
通常将预测应用于查询执行的结果。因此,它们目前被设计为选择性地应用于域类型。
从最新的Spring Data Fowler发行版GA发行以来,可以在Spring MVC控制器中以编程方式使用投影基础结构。只需为以下对象声明一个Spring bean SpelAwareProxyProjectionFactory:
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 lambda使用来提供转换步骤ProjectionFactory。
Page
map(…)
ProjectionFactory