- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Spring Data Rest 之上构建 REST API。最初扩展 JpaRepository 的所有存储库。最近决定采取更灵活的方法并使用 QueryDslPredicateExecutor<T>
连同 QuerydslBinderCustomizer<Q>.
几乎所有findAll
存储库中公开的方法应解决两种情况
校长有一个角色 ROLE_ADMIN
那么不应对来自 Pageable
的部分应用过滤, Sort
校长没有角色 ROLE_ADMIN
我只会返回那些属于当前用户的实体
完成这项工作就像注释 findAll
一样简单方法如下。
@Query("select e from Entity e where e.field = ?#{principal} or 1=?#{hasRole('ROLE_ADMIN') ? 1 : 0}")
Page<Entity> findAll(Pageable pageable);
现在我想要我们的 findAll
类似于下面的内容
Page<Entity> findAll(Predicate predicate, Pageable pageable)
Predicate
正在根据请求参数构建(由 @QuerydslPredicate
提供)并传递给 RepositoryEntityController
这一切都由 spring-data-rest 管理,这很棒。
@ResponseBody
@RequestMapping(value = BASE_MAPPING, method = RequestMethod.GET)
public Resources<?> getCollectionResource(@QuerydslPredicate RootResourceInformation resourceInformation,
DefaultedPageable pageable, Sort sort, PersistentEntityResourceAssembler assembler)
throws ResourceNotFoundException, HttpRequestMethodNotSupportedException {
我想调整那个谓词(上面我想解决的 2 个场景)。这将类似于下面的内容。
BooleanBuilder builder = new BooleanBuilder(predicateBuildFromHttpRequest);
builder.and(predicateAddressingOurRequirements);
builder.getValue();
@PostFilter
不会是一个选项,因为所有 repo 协议(protocol)的返回类型都是 Page<Entity>
.
我想解决的用例对我来说似乎很常见。话虽如此,我查看了 spring-data 和 spring-data-rest 文档,但找不到与我的问题相关的任何内容。
问题是:我是否在这里遗漏了一些明显的东西并且可以快速取胜?或者我需要自己实现定制解决方案?非常感谢任何意见!
最佳答案
Querydsl 谓词由 QuerydslAwareRootResourceInformationHandlerMethodArgumentResolver
构造,遗憾的是它是私有(private)包,不能直接扩展。
但是,您可以复制它,添加您的安全谓词逻辑,然后放入您的实现而不是以前的解析器。
public class MyQueryDslRootResourceArgumentResolver extends RootResourceInformationHandlerMethodArgumentResolver {
// the most of the code is ommitted, the content is identical with
// QuerydslAwareRootResourceInformationHandlerMethodArgumentResolver,
// the important part is postProcessMethod where you can modify the predicate
@Override
@SuppressWarnings({"unchecked"})
protected RepositoryInvoker postProcess(MethodParameter parameter, RepositoryInvoker invoker,
Class<?> domainType, Map<String, String[]> parameters) {
Object repository = repositories.getRepositoryFor(domainType);
if (!QueryDslPredicateExecutor.class.isInstance(repository)
|| !parameter.hasParameterAnnotation(QuerydslPredicate.class)) {
return invoker;
}
ClassTypeInformation<?> type = ClassTypeInformation.from(domainType);
QuerydslBindings bindings = factory.createBindingsFor(null, type);
// modify your predicate here
Predicate predicate = predicateBuilder.getPredicate(type, toMultiValueMap(parameters), bindings);
return new QuerydslRepositoryInvokerAdapter(invoker, (QueryDslPredicateExecutor<Object>) repository, predicate);
}
}
然后使用自定义解析器实现添加您自己的配置类。
public class CustomRepositoryRestMvcConfiguration extends RepositoryRestMvcConfiguration {
@Autowired
ApplicationContext applicationContext;
@Override
public RootResourceInformationHandlerMethodArgumentResolver repoRequestArgumentResolver() {
QuerydslBindingsFactory factory = applicationContext.getBean(QuerydslBindingsFactory.class);
QuerydslPredicateBuilder predicateBuilder = new QuerydslPredicateBuilder(defaultConversionService(),
factory.getEntityPathResolver());
return new MyQueryDslRootResourceArgumentResolver(repositories(),
repositoryInvokerFactory(defaultConversionService()), resourceMetadataHandlerMethodArgumentResolver(),
predicateBuilder, factory);
}
}
关于spring-security - QueryDslPredicateExecutor 和 Spring Data Rest 方面的安全上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41870491/
我发现 QueryDslPredicateExecutor 对于减少样板文件非常有用,但它似乎给工作带来了麻烦。我现在尝试使用自定义基类存储库扩展 JpaRepository,但在启动时,Spring
当我尝试使用 Querydsl 时,如 Spring 引用 Spring 1.10.4.RELEASE reference 中所示- 我从 IDE 收到一些错误: 无法解析方法 findAll(pre
我尝试按照Spring Data JPA with QueryDSL中的教程进行操作 我的代码版本如下: spring-boot = 1.3.8.release 查询 dsl = 3.7.4 我的实体
我有一个基于 Spring Data 和 JPA QueryDSL 的项目,其中我有许多扩展 QueryDslPredicateExecutor 的存储库接口(interface),如下所示: pub
我有一个实体如下: @Entity public class Enterprise{ private String sid = UUID.randomUUID().toString(); pr
假设我有一个这样的数据模型(伪代码): @Entity Person { @OneToMany List attributes; } @Entity PersonAttribute {
我正在 Spring Data Rest 之上构建 REST API。最初扩展 JpaRepository 的所有存储库。最近决定采取更灵活的方法并使用 QueryDslPredicateExecut
我正在使用下面的代码使用存储库从 mongo 获取数据: BooleanBuilder booleanBuilder = new BooleanBuilder(); booleanBuilder
我被这个错误困住了: 我想使用一种方法,通过 QueryDslPredicateExecutor 对谓词进行搜索。当该方法在我的服务实现上运行时,出现此错误: 16:59:44,165 DEBUG [
我花了几个小时在 spring 数据中找到 QueryDslPredicateExecutor。为什么叫它QueryDslPredicateExecutor 在文档和博客中,但 QuerydslPre
我正在尝试将 QueryDslPredicateExecutor 与 MongoDB 和 Spring-Data 一起使用,但它似乎对“exists()”属性感到窒息。 我正在使用 - org.spr
我是一名优秀的程序员,十分优秀!