【问题标题】:Spring Data REST - Override repository findAll without creating /search/findAll URLSpring Data REST - 覆盖存储库 findAll 而不创建 /search/findAll URL
【发布时间】:2017-11-18 17:23:43
【问题描述】:

有什么方法可以阻止 Spring Data REST 为覆盖的存储库方法创建 /search URL?

例如,以下代码会生成一个 /search/findAll URL,它复制了集合资源的功能:

public interface EmployeeRepository extends CrudRepository<Employee, Long>
{
    @Override
    @Query("SELECT e FROM Empolyee e")
    Iterable<Employee> findAll();
}

这只是覆盖单个方法时的表面问题,但如果您尝试覆盖具有相同函数名称和不同参数的多个方法,例如 PagingAndSortingRepository 中的两个 findAll 方法,那么 spring 会抛出异常,因为它正在尝试映射 2 个函数到同一条路。

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long>
{
    @Override
    @Query("SELECT e FROM Employee e")
    Iterable<Employee> findAll();

    @Override
    @Query("SELECT e FROM Employee e")
    Iterable<Employee> findAll(Sort sort);

    @Override
    @Query("SELECT e FROM Employee e")  
    Page<Employee> findAll(Pageable pageable);
}

结果:

java.lang.IllegalStateException: Ambiguous search mapping detected. Both public abstract java.lang.Iterable uk.co.essl.roster.entity.employee.EmployeeRepository.findAll(org.springframework.data.domain.Sort) and public abstract java.lang.Iterable uk.co.essl.roster.entity.employee.EmployeeRepository.findAll() are mapped to /findAll! Tweak configuration to get to unambiguous paths!
    at org.springframework.data.rest.core.mapping.SearchResourceMappings.<init>(SearchResourceMappings.java:60)
    at org.springframework.data.rest.core.mapping.RepositoryResourceMappings.getSearchResourceMappings(RepositoryResourceMappings.java:128)
    at springfox.documentation.spring.data.rest.EntityContext.searchMappings(EntityContext.java:107)
    ...

【问题讨论】:

    标签: java spring rest spring-data-rest


    【解决方案1】:

    有什么方法可以阻止 Spring Data REST 为覆盖的存储库方法创建 /search URL?

    我发现了以下技巧来解决这个问题:

    @Override
    default Page<Employee> findAll(Pageable pageable) {
        return findBy(pageable);
    }
    
    @RestResource(exported = false)
    Page<Employee> findBy(Pageable pageable);
    

    更多其他此技巧允许您为“获取所有记录”请求设置默认排序顺序:

    @Override
    default Page<Employee> findAll(Pageable p) {
        if (p.getSort() == null) {      
            // The default sort order
            return findBy(new PageRequest(p.getPageNumber(), p.getPageSize(), Sort.Direction.DESC, "myField"));
        }
        return findBy(pageable);
    }
    

    享受吧! ))


    @RestResource(exported=false) 仅用于覆盖方法将无济于事,因为这会阻止 GET '所有记录' 请求(

    【讨论】:

      【解决方案2】:

      @RestResource(exported = false)

      【讨论】:

      • 这也会阻止标准集合资源被导出。
      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 2018-01-02
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 2014-05-31
      • 1970-01-01
      相关资源
      最近更新 更多