2015-07-13 16 views
8

Rest-Endpoints oluşturmak için JpaRepository ile yaylı veri dinlenme özelliğini kullanıyorum. Varsayılan olarak, tüm JpaRepository için çağrı etkin, iyi bir şey nedir. Ancak, yeni yığımıza çağrıları desteklemeyen eski bir uygulamamız var. Yeni uygulama kodunda çağrıları kullanmaya devam etmek için bir URL-Parametresine bağlı olarak çağrıyı devre dışı bırakmak istiyorum. Yay-veri-dinlemesi için JpaRepository için çağrı devre dışı bırakma

Birlikte ve çağrı olmadan kaynak ortaya çıkarmak için çeşitli yaklaşımlar çalıştı:

  • kullanın CrudRepository: Sadece sayfalanmamış son nokta ve flush eksik yöntem sahip sonuçlanır.
  • Veri havuzumda List<T> findAll() yöntemini geçersiz kılın ve RestResource ile açıklayın. Yöntemin arama yöntemi olarak açıklanmasını beklerdim, ama öyle değil.
  • @RestResource(exported=false) ile Page<T> findAll(Pageable pageable)'u ekleyin ve daha önce bulunan mermi ile List<T> findAll() belirtin. Bunun varsayılan yöntemi değiştirdiğini umuyordum. Ancak bu geçerli bir çözüm değildir, çünkü yalnızca bir disk belleği olmayan son nokta açığa çıkar.
  • Geçiş size=-1 sınırsız bir sonuç almak için -> Standart çağrı büyüklüğü kullanılır Bahar-kontrolör RepositoryEntityController depo üzerinde yöntemleri çağırmak için bir RepositoryInvoker kullandığını gördük

. PageablePageableHandlerMethodArgumentResolver kullanılarak her zaman bir pageable döndüren (sorgu, açıklamalı veya varsayılan sayfalanabilir olarak belirtilmiş) kullanılarak çözülür. Şu an için gördüğüm tek çözüm, özel bir url parametresi iletilirse null değerini döndüren özel bir PageableHandlerMethodArgumentResolver uygulanmasıdır.

Başka bir çözüm biliyor musunuz ya da gelecek için benzer bir planınız var mı?

sayesinde Micha

cevap

2

Sen Depo arayüzüne kendi yöntemleri ekleyin ve List<DomainObject> veya Collection<DomainObject> bir dönüş türü ve hiçbir Pageable parametre olabilir. Bu, disk belleği olmayan bir yanıtın kullanılmasına neden olur. Daha sonra eski istemcinizi varsayılanlar yerine bu yöntemlere yönlendirebilirsiniz. Veya, varsayılan sayfa boyutunu çok büyük olacak şekilde yapılandırabilirsiniz. application.properties'da spring.data.rest.default-page-size'u ayarlayın.

3

benim pageableResolver ayarlamak için PagingAndSortingRepository ve bu yapılandırmayı kullan:

@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; 
    } 
} 

Bkz: https://jira.spring.io/browse/DATACMNS-929 sayfası ve boyutu istenen sayfayı almak isteğe dahil, ama eğer olurlarsa olan

Bu şekilde eğer istekte değil tüm kayıtları alırsınız. Her iki durumda da bir sıralama belirtilirse, verileri sıralamak için kullanılır. İkinci durumda, kayıtlar bir sayfanın içinde döndürülür, ancak bununla yaşayabilirim. Eğer bir null fallbackPageable ile çözümleyicinizi yapılandırmak mümkün olacak yeni versiyonları ile çok

DÜZENLEME https://jira.spring.io/browse/DATACMNS-929, düzeltildi.Bu şekilde, bundan sayfalanabilir veriler (yani page ve size) Bir sayfayı almak mevcutsa, ama değil ne zaman tüm kayıtları almak:

@Configuration 
public class RestApiConfiguration extends RepositoryRestConfigurerAdapter { 

    @Bean 
    public HateoasPageableHandlerMethodArgumentResolver customResolver(
     HateoasPageableHandlerMethodArgumentResolver pageableResolver) { 
     pageableResolver.setOneIndexedParameters(true); 
     pageableResolver.setFallbackPageable(null); 
     return pageableResolver; 
    } 
} 
İlgili konular