Spring 数据 REST - 覆盖存储库 findAll 而不创建 /search/findAll URL
Spring Data REST - Override repository findAll without creating /search/findAll URL
有什么方法可以防止 Spring Data REST 为覆盖的存储库方法创建 /search URLs?
例如,以下代码导致生成 /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)
...
@RestResource(exported = false)
Is there any way to prevent Spring Data REST from creating a /search URLs for overridden repository methods?
我发现以下技巧可以解决这个问题:
@Override
default Page<Employee> findAll(Pageable pageable) {
return findBy(pageable);
}
@RestResource(exported = false)
Page<Employee> findBy(Pageable pageable);
更多其他此技巧允许您为 'get all records' 请求设置默认排序顺序:
@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 'all records' 请求(
有什么方法可以防止 Spring Data REST 为覆盖的存储库方法创建 /search URLs?
例如,以下代码导致生成 /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)
...
@RestResource(exported = false)
Is there any way to prevent Spring Data REST from creating a /search URLs for overridden repository methods?
我发现以下技巧可以解决这个问题:
@Override
default Page<Employee> findAll(Pageable pageable) {
return findBy(pageable);
}
@RestResource(exported = false)
Page<Employee> findBy(Pageable pageable);
更多其他此技巧允许您为 'get all records' 请求设置默认排序顺序:
@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 'all records' 请求(