【发布时间】:2018-07-06 11:56:22
【问题描述】:
我正在尝试做一些有趣的事情,我希望能够使用 Spring Boot 1.5.9 和 Spring Data Rest 动态构建 sql 查询过滤器,而无需编写控制器。我觉得我可能走在正确的道路上,但我有点卡住了。
这个想法是通过使用 HandlerInterceptorAdapter 拦截一个 HTTP Request GET 方法,并将 Request 查询参数存储到 PagingAndSortingRepository 可以使用的对象中。计划是覆盖 Spring Data Rest 默认使用的 findAll(Pageable p),调用 findAll(Specification s, Pageable p) 以允许动态过滤。
我使用了 Spring 提供的 Request Scope 来保存查询参数,让我可以在整个 Request 的生命周期中使用它们。
问题是我无法从 Repository 接口文件访问 QueryParam 对象。我尝试按照这个stackoverflow解决方案在接口文件中使用依赖注入,但它不起作用:Spring Dependency injection for interfaces
Spring Data Rest 尝试通过基于函数名称构建 SQL 查询来创建端点。即使我试图通过创建一个可以查询的函数来欺骗 Spring Data 来解决这个问题,然后用我在下面实现的 SampleRepositoryComponents 覆盖它,我也无法获取存储在 QueryParam 中的数据。
其他人也提出了拉取请求,允许 Spring Data Rest 忽略某些方法:https://github.com/spring-projects/spring-data-rest/pull/286
查询参数:
public class QueryParam {
String query_string;
Map<String, String[]> parameter_map;
public String getQuery_string() {
return query_string;
}
public void setQuery_string(String query_string) {
this.query_string = query_string;
}
public Map<String, String[]> getParameter_map() {
return parameter_map;
}
public void setParameter_map(Map<String, String[]> parameter_map) {
this.parameter_map = parameter_map;
}
}
SampleRepository:
@RepositoryRestResource(collectionResourceRel = "Sample", path = "Sample")
public interface SampleRepository extends PagingAndSortingRepository<Sample, UUID>,
JpaSpecificationExecutor<Sample> {
// Cannot just use any custom name
@RestResource(exported = false)
public QueryParam getQuery_param();
default public Page<Sample> findAll(Pageable p) {
QuerySpecification<Sample> qs = new QuerySpecification<Sample>(getQuery_param());
return findAll(qs, p);
}
}
查询规范:
public class QuerySpecification<T> implements Specification<T> {
private QueryParam query_param;
public QuerySpecification(QueryParam query_param) {
this.query_param = query_param;
};
@Override
public Predicate toPredicate(Root<T> rt, CriteriaQuery<?> cq, CriteriaBuilder cb) {
// Build your custom predicate here
return null;
}
}
SampleRepositoryComponents:
@Component
public abstract class SampleRepositoryComponents implements SampleRepository {
@Autowired
private QueryParam query_param;
@Override
public QueryParam getQuery_param() {
return this.query_param;
}
public void setQuery_param(QueryParam query_param) {
this.query_param = query_param;
}
}
【问题讨论】:
标签: java spring spring-boot spring-data spring-data-rest