是否可以指定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
for findEmployeeUsers
像上面那样直接调用方法时?
我意识到上面的代码对某人来说可能看起来很奇怪......可以通过 REST 公开存储库并将@PreAuthorize
存储库中的东西。认为控制器是进行安全检查的更合适的地方 - 它更自然且更易于测试。
So, can projection
是否以某种方式传递到直接调用的存储库方法中?
不,不是,特别是因为投影通常根据具体情况应用于查询执行的结果。因此,它们目前被设计为选择性地应用于域类型。
从最新的 Spring Data Fowler 版本系列 GA 版本开始,投影基础设施可以在 Spring MVC 控制器中以编程方式使用。只需声明一个 Spring beanSpelAwareProxyProjectionFactory
:
@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
has a map(…)
可用于动态转换页面内容的方法。我们使用 JDK 8 lambda 来提供转换步骤,使用ProjectionFactory
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)