gpt4 book ai didi

spring - 如何在 Spring MVC Controller 中应用 Spring Data 投影?

转载 作者:IT老高 更新时间:2023-10-28 13:50:23 24 4
gpt4 key购买 nike

直接调用数据仓库方法时是否可以指定projection?这是存储库代码 - 请注意,我不想通过 REST 公开它,而是希望能够从服务或 Controller 调用它:

@RepositoryRestResource(exported = false)
public interface UsersRepository extends PagingAndSortingRepository<User, Long> {

@Query(value = "SELECT u FROM User u WHERE ....")
public Page<User> findEmployeeUsers(Pageable p);
}

然后在 Controller 中我这样做:

@PreAuthorize(value = "hasRole('ROLE_ADMIN')")
@RequestMapping(value = "/users/employee")
public Page<User> listEmployees(Pageable pageable) {
return usersRepository.findEmployeeUsers(pageable);
}

有什么方法可以在像上面那样直接调用findEmployeeUsers方法时指定projection

我意识到上面的代码对某些人来说可能看起来很奇怪......可以通过 REST 公开存储库并将 @PreAuthorize 东西放在存储库中。思想 Controller 是进行安全检查的更合适的地方 - 它更自然且测试更简单。

那么,projection 东西是否可以以某种方式传递到直接调用的存储库方法中?

最佳答案

不,不是,尤其是预测通常会根据具体情况应用于查询执行的结果。因此,它们目前被设计为选择性地应用于域类型。

从最新的 Spring Data Fowler 发布火车 GA 版本开始,投影基础架构可以在 Spring MVC Controller 中以编程方式使用。只需为 SpelAwareProxyProjectionFactory 声明一个 Spring bean:

@Configuration
class SomeConfig {

@Bean
public SpelAwareProxyProjectionFactory projectionFactory() {
return new SpelAwareProxyProjectionFactory();
}
}

然后将其注入(inject)您的 Controller 并使用它:

@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 的转换步骤。

关于spring - 如何在 Spring MVC Controller 中应用 Spring Data 投影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29376090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com