如何在Spring MVC控制器中应用Spring Data投影?
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存储库中。Thought Controller是进行安全检查的更正确的地方-它更自然也更容易测试。
那么,projection
事情可以以某种方式传递到直接调用的存储库方法中吗?
回答:
通常将预测应用于查询执行的结果。因此,它们目前被设计为选择性地应用于域类型。
从最新的Spring Data Fowler发行版GA发行以来,可以在Spring MVC控制器中以编程方式使用投影基础结构。只需为以下对象声明一个Spring bean SpelAwareProxyProjectionFactory
:
@Configurationclass SomeConfig {
@Bean
public SpelAwareProxyProjectionFactory projectionFactory() {
return new SpelAwareProxyProjectionFactory();
}
}
然后将其注入你的控制器并使用它:
@Controllerclass 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 MVC控制器中应用Spring Data投影? 的全部内容, 来源链接: utcz.com/qa/397273.html