2015-07-13 27 views
8

Tôi đang sử dụng phần còn lại của dữ liệu vào mùa xuân với JpaRepository để tạo Rest-Endpoints. Theo mặc định, phân trang được bật cho tất cả JpaRepository, điều tốt là gì. Nhưng tôi có một ứng dụng kế thừa mà chúng tôi chuyển sang ngăn xếp mới không hỗ trợ phân trang. Tôi muốn tắt phân trang tùy thuộc vào URL-Tham số để vẫn có thể sử dụng phân trang trong mã ứng dụng mới.Cách tắt phân trang cho JpaRepository trong phần còn lại của dữ liệu vào mùa xuân

tôi đã cố gắng tiếp cận khác nhau để vạch trần các nguồn lực có và không có phân trang:

  • Sử dụng CrudRepository: Kết quả chỉ có một thiết bị đầu cuối không có đánh số trang và phương pháp flush là mất tích.
  • Ghi đè phương thức List<T> findAll() trong giao diện lưu trữ của tôi và chú thích nó bằng RestResource. Tôi đã có thể mong đợi rằng phương pháp sẽ được tiếp xúc như là phương pháp tìm kiếm, nhưng nó không phải là.
  • Chú thích Page<T> findAll(Pageable pageable) với @RestResource(exported=false) và chú thích List<T> findAll() như trong dấu đầu dòng trước đó. Tôi đã hopped rằng điều này thay thế phương pháp mặc định. Nhưng đây không phải là giải pháp hợp lệ, bởi vì chỉ có một điểm cuối không phân trang được tiếp xúc.
  • đèo size=-1 để có được một kết quả không giới hạn -> kích thước mặc định phân trang được sử dụng

I have seen that mùa xuân-controller RepositoryEntityController sử dụng một RepositoryInvoker để gọi các phương pháp trên kho. Pageable được giải quyết bằng cách sử dụng PageableHandlerMethodArgumentResolver luôn trả về một trang có thể xem được (được chỉ định trong truy vấn, chú thích hoặc mặc định có thể xem được). Giải pháp duy nhất mà tôi thấy trong thời điểm này là triển khai PageableHandlerMethodArgumentResolver tùy chỉnh trả về giá trị rỗng, nếu thông số url tùy chỉnh được chuyển.

Bạn có biết bất kỳ giải pháp nào khác hoặc bất kỳ điều gì tương tự đã được lên kế hoạch cho tương lai không?

Cảm ơn, Micha

Trả lời

2

Bạn có thể thêm các phương pháp của riêng bạn để giao diện Repository, và có một kiểu trả về của List<DomainObject> hoặc Collection<DomainObject> và không Pageable tham số. Điều đó sẽ gây ra phản hồi không được phân trang sẽ được sử dụng. Sau đó, bạn có thể trỏ khách hàng cũ của mình vào các phương pháp đó thay vì các phương thức mặc định.

Hoặc, bạn có thể định cấu hình kích thước trang mặc định là rất lớn. Đặt spring.data.rest.default-page-size trong application.properties.

3

tôi sử dụng PagingAndSortingRepository và cấu hình này để thiết lập pageableResolver tôi:

@Configuration 
public class RestApiConfiguration extends RepositoryRestConfigurerAdapter { 

    @Bean 
    public HateoasPageableHandlerMethodArgumentResolver customResolver(
     HateoasPageableHandlerMethodArgumentResolver pageableResolver) { 
     pageableResolver.setOneIndexedParameters(true); 
     pageableResolver.setFallbackPageable(new PageRequest(0, Integer.MAX_VALUE)); 
     pageableResolver.setMaxPageSize(Integer.MAX_VALUE); 
     return pageableResolver; 
    } 
} 

Xem: https://jira.spring.io/browse/DATACMNS-929

Bằng cách này nếu trang và kích thước có trong yêu cầu bạn nhận được trang bạn yêu cầu, nhưng nếu họ không có trong yêu cầu bạn nhận được tất cả hồ sơ. Trong cả hai trường hợp nếu một loại được chỉ định, nó được sử dụng để sắp xếp dữ liệu. Trong trường hợp thứ hai, các hồ sơ được trả lại bên trong một trang, nhưng tôi có thể sống với điều đó.

EDIT https://jira.spring.io/browse/DATACMNS-929 đã được cố định, vì vậy với các phiên bản mới, bạn sẽ có thể cấu hình phân giải của bạn với một fallbackPageable null.Bằng cách đó, khi dữ liệu có thể chia sẻ (tức là pagesize) có mặt, bạn truy xuất một trang, nhưng khi bạn không truy xuất tất cả hồ sơ:

@Configuration 
public class RestApiConfiguration extends RepositoryRestConfigurerAdapter { 

    @Bean 
    public HateoasPageableHandlerMethodArgumentResolver customResolver(
     HateoasPageableHandlerMethodArgumentResolver pageableResolver) { 
     pageableResolver.setOneIndexedParameters(true); 
     pageableResolver.setFallbackPageable(null); 
     return pageableResolver; 
    } 
} 
Các vấn đề liên quan