如何在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);

}

有没有什么方法来指定projectionfindEmployeeUsers,当它被称为直接像上面的方法?

我意识到上面的代码对于某些人来说可能看起来很奇怪…可以通过REST公开存储库并将其放入@PreAuthorize存储库中。Thought Controller是进行安全检查的更正确的地方-它更自然也更容易测试。

那么,projection事情可以以某种方式传递到直接调用的存储库方法中吗?

回答:

通常将预测应用于查询执行的结果。因此,它们目前被设计为选择性地应用于域类型。

从最新的Spring Data Fowler发行版GA发行以来,可以在Spring MVC控制器中以编程方式使用投影基础结构。只需为以下对象声明一个Spring bean 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

以上是 如何在Spring MVC控制器中应用Spring Data投影? 的全部内容, 来源链接: utcz.com/qa/397273.html

回到顶部