@RestController vs @RepositoryRestResource ne zaman kullanılır?


87

Spring'in REST ile nasıl kullanılacağına dair çeşitli örneklere bakıyordum . Nihai hedefimiz bir Bahar HATEOAS/HALkurulumu

Ben oluşturma için iki ayrı yöntemler gördük DİNLENME içinde Bahar

  1. Via @RestControllerBir Kontrolör içinde

  2. Via @RepositoryRestResourcebir depoyu içinde

Bulmaya çalıştığım şey, neden birini diğerine tercih ettiğin. HALHangisinin en iyisi olduğunu uygulamaya çalışırken ?

Veritabanı arka ucumuz Neo4j'dir .

Yanıtlar:


62

Tamam, öyleyse kısa hikaye, Spring JPA ile @RepositoryRestResourcebir HATEOAS hizmeti yarattığı için kullanmak istediğinizdir .

Gördüğünüz gibi burada bir tam fonksiyonel olması bu ek açıklama eklemeye ve Pojo bağlayarak HATEOAS depo yöntem veya DİNLENME hizmet yöntemlerini uygulamak zorunda kalmadan hizmet

Eğer eklerseniz, @RestControllerortaya çıkarmak istediğiniz her yöntemi kendi başınıza uygulamanız gerekir ve ayrıca bunu bir HATEOAS formatına aktarmaz .


7
Varsayılan olarak, Spring Data REST TÜM üst düzey genel arayüz havuzlarını dışa aktarır. Yalnızca @RepositoryRestResource'a bir arabirimi VERMEMEK veya uç noktanın ayrıntılarını değiştirmek için ihtiyacınız vardır.
gregturn

4
RestController'ı Spring Data REST ile birlikte kullanırsanız, Spring Data REST'in sağladığı HER ŞEYİ kenara atarsınız. Spring verisi REST'in mesaj dönüştürücülerini vb. Kullanan özel bir Spring MVC denetleyicisini kodlamak için BasePathAwareController'a bakın.
gregturn

Kabul edilen cevabın doğru olduğunu düşünmüyorum @gregturn daha iyi bir cevaba sahip.
Mark

39

Varlığa özgü eylemler gerçekleştirip gerçekleştirmediğinize bağlı olarak @BasePathAwareController veya @RepositoryRestController'ı kullanmak için özetlemediğiniz üçüncü (ve dördüncü) bir seçenek var.

@RepositoryRestResource, genel Depo arayüzündeki seçenekleri ayarlamak için kullanılır - genişletilmekte olan Depo türüne göre uygun şekilde uç noktaları otomatik olarak oluşturur (örn. CrudRepository / PagingAndSortingRepository / vb.).

@BasePathAwareController ve @RepositoryRestController, uç noktaları manuel olarak oluşturmak istediğinizde ancak ayarladığınız Spring Data REST yapılandırmalarını kullanmak istediğinizde kullanılır.

@RestController'ı kullanırsanız, farklı yapılandırma seçeneklerine sahip paralel bir uç nokta kümesi oluşturacaksınız - örneğin farklı bir mesaj dönüştürücü, farklı hata işleyicileri, vb. - ancak bunlar mutlu bir şekilde bir arada var olacaklar (ve muhtemelen karışıklığa neden olacaklar).

Özel dokümantasyon burada bulunabilir .


6
Bunun artık doğru olmadığını düşünüyorum. Eğer a @RestController, a ile aynı yolu kullanıyorsa, @RepositoryRestResourcearşiv uç noktaları oluşturulmayacaktır.
Hubert Grzeskowiak

19

Pekala, yukarıdaki cevaplar kendi bağlamında doğrudur, yine de size pratik bir örnek veriyorum.

Birçok senaryoda, API'nin bir parçası olarak, bir varlığı belirli kriterlere göre aramak için uç noktalar sağlamamız gerekir. Artık JPA kullanarak sorgu yazmanıza bile gerek yok, sadece Spring-JPA'nın belirli isimlendirilmesiyle bir arayüz ve yöntemler yapın. Bu tür API'leri açığa çıkarmak için, bu depo yöntemlerini ve son olarak Hizmet katmanını çağırarak uç noktaları açığa çıkaran Denetleyicileri çağıran Hizmet katmanı yapacaksınız.

Spring'in burada yaptığı şey, bu tür arabirimlerden (depolar) bu uç noktaları açığa çıkarmanıza izin verir, bunlar genellikle arama varlığına GET çağrılarıdır ve arka planda son uç noktaları oluşturmak için gerekli dosyaları üretir. Yani @RepositoryRestResource kullanıyorsanız, Service / Controller katmanı oluşturmanıza gerek yoktur.

Öte yandan @RestController, özellikle json verileriyle ilgilenen ve geri kalan bir denetleyici olarak çalışan bir denetleyicidir. Kısaca @Controller + @ResponseBody = @RestController.

Bu yardımcı olur umarım.

Aynı şekilde çalışan örneğime ve bloguma bakın:
http://sv-technical.blogspot.com/2015/11/spring-boot-and-repositoryrestresource.html
https://github.com/svermaji/Spring-boot-with -hibernate-no-controller


İnsanların bloguma gittiğini görebiliyorum, eğer bu çözüm işe yararsa lütfen oy verin.
shaILU

10

@RepositoryRestController varsayılan olarak oluşturulan Spring Data REST denetleyicilerini açık depodan geçersiz kılın.

Spring Data REST'in ayarlarından, mesaj dönüştürücülerinden, istisna işlemeden ve daha fazlasından yararlanmak için @RepositoryRestControllerstandart Spring MVC yerine notu kullanın @Controllerveya@RestController

Örneğin, bu denetleyiciler spring.data.rest.basePathyönlendirme için temel yol olarak Spring Boot ayarını kullanır .

Bkz. Spring Verisi REST Yanıt İşleyicilerini Geçersiz Kılma .

@ResponseBodyKaçırılan eklemenin farkında olun@RepositoryRestController

Depoyu göstermediyseniz (olarak işaretlenmiş @RepositoryRestResource(exported = false)), @BasePathAwareControllerbunun yerine ek açıklama kullanın

Ayrıca çantalara dikkat edin

ControllerLinkBuilderSpring Data REST'in temel yolunu hesaba katmaz ve @RequestMappingsınıf / tür düzeyinde kullanılmamalıdır

ve

Temel yol HAL'de görünmüyor

Bağlantıyı düzeltmek için geçici çözüm: https://stackoverflow.com/a/51736503/548473

GÜNCELLEME: Sonunda @RepositoryRestController, birçok geçici çözüm nedeniyle kullanmayı tercih etmiyorum .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.