Saya mencoba untuk mencampur MVC dan istirahat dalam satu proyek boot musim semi.
Saya ingin menetapkan jalur dasar untuk semua pengontrol lainnya (mis. Example.com/api) di satu tempat (saya tidak ingin membubuhi keterangan setiap pengontrol dengan @RequestMapping('api/products')
, sebagai gantinya, hanya @RequestMapping('/products')
.
Pengontrol Mvc harus dapat diakses melalui example.com/whatever
Apa itu mungkin?
(Saya tidak menggunakan pegas data rest, hanya pegas mvc)
java
spring
rest
spring-boot
spring-mvc
Teimuraz
sumber
sumber
Jawaban:
Dengan Spring Boot 1.2+ (<2.0) yang dibutuhkan hanyalah satu properti di application.properties:
tautan ref: https://docs.spring.io/spring-data/rest/docs/current/reference/html/#getting-started.changing-base-uri
Untuk 2.x, gunakan
sumber
Agak terlambat tetapi pertanyaan yang sama membawa saya ke sini sebelum mencapai jawabannya jadi saya mempostingnya di sini. Buat (jika Anda masih belum memilikinya) sebuah application.properties dan tambahkan
Jadi pada contoh sebelumnya jika Anda memiliki RestController dengan
@RequestMapping("/test")
Anda akan mengaksesnya sepertilocalhost:8080/api/test/{your_rest_method}
sumber pertanyaan: bagaimana cara memilih url untuk aplikasi web boot musim semi saya
sumber
Untuk versi kerangka boot musim semi
2.0.4.RELEASE+
. Tambahkan baris ini keapplication.properties
sumber
spring.data.rest.basePath
tidak bekerja untuk Spring boot 2Karena ini adalah serangan Google pertama untuk masalah ini dan saya berasumsi lebih banyak orang akan mencari ini. Ada opsi baru sejak Spring Boot '1.4.0'. Sekarang dimungkinkan untuk menentukan RequestMappingHandlerMapping kustom yang memungkinkan untuk menentukan jalur berbeda untuk kelas yang dianotasi dengan @RestController
Versi berbeda dengan anotasi khusus yang menggabungkan @RestController dengan @RequestMapping dapat ditemukan di entri blog ini
sumber
Saya tidak percaya betapa rumitnya jawaban atas pertanyaan yang tampaknya sederhana ini. Berikut beberapa referensinya:
Ada banyak hal berbeda yang perlu dipertimbangkan:
server.context-path=/api
diapplication.properties
Anda dapat mengkonfigurasi awalan untuk semuanya . (Server.context-pathnya bukan server.contextPath!)spring.data.rest.base-path
diapplication.properties
. Tapi jelas@RestController
tidak akan memperhitungkan ini. Menurut dokumentasi pegas data rest, ada anotasi@BasePathAwareController
yang dapat Anda gunakan untuk itu. Tetapi saya memiliki masalah sehubungan dengan Spring-security ketika saya mencoba mengamankan pengontrol semacam itu. Itu tidak ditemukan lagi.Solusi lain adalah trik sederhana. Anda tidak dapat memberi awalan String statis dalam anotasi, tetapi Anda dapat menggunakan ekspresi seperti ini:
sumber
Untuk Boot 2.0.0+ ini berfungsi untuk saya: server.servlet.context-path = / api
sumber
Saya menemukan solusi bersih, yang hanya memengaruhi pengontrol istirahat.
Spring boot akan mendaftarkan dua servlet dispatcher - default
dispatcherServlet
untuk pengontrol, danrestApi
dispatcher untuk@RestControllers
ditentukan direst.xml
:Contoh
rest.xml
:Tapi, Anda tidak terbatas pada :
XmlWebApplicationContext
, Anda dapat menggunakan jenis konteks lain yang tersedia, yaitu.AnnotationConfigWebApplicationContext
,GenericWebApplicationContext
,GroovyWebApplicationContext
, ...jsonMessageConverter
,messageConverters
kacang dalam konteks istirahat, mereka dapat didefinisikan dalam konteks induksumber
Anda dapat membuat anotasi khusus untuk pengontrol Anda:
Gunakan ini sebagai ganti @RestController biasa pada kelas pengontrol Anda dan anotasi metode dengan @RequestMapping.
Baru saja diuji - berfungsi di Spring 4.2!
sumber
RequestMappingHandlerMapping
. Spring Data REST memiliki mapper yang mirip dengan yang Anda butuhkan -BasePathAwareHandlerMapping
.Saya mungkin agak terlambat, TAPI ... Saya yakin ini adalah solusi terbaik. Siapkan di application.yml Anda (atau file konfigurasi analogis):
Seperti yang saya ingat, itu saja - semua repositori Anda akan ditampilkan di bawah URI ini.
sumber
spring.data.rest.base-path
hanya mempengaruhi spring-data-rest dan spring-hateoas. @RestController biasa akan tetap berada di root!Coba gunakan PathMatchConfigurer (Spring Boot 2.x):
sumber
Anda dapat membuat kelas dasar dengan
@RequestMapping("rest")
penjelasan dan memperluas semua kelas lainnya dengan kelas dasar ini.Sekarang semua kelas yang memperluas kelas dasar ini dapat diakses di
rest/**
.sumber
Bagi mereka yang menggunakan konfigurasi YAML (application.yaml).
Catatan : ini hanya berfungsi untuk
Spring Boot 2.x.x
Jika Anda masih menggunakan
Spring Boot 1.x
sumber
Dengan spring-boot 2.x Anda dapat mengonfigurasi di application.properties:
sumber
server.servlet.context-path=/api
akan menjadi solusi yang saya kira. Saya memiliki masalah yang sama dan ini membuat saya terselesaikan. Saya menggunakan server.context-path. Namun, itu sepertinya sudah usang dan saya menemukan ituserver.servlet.context-path
menyelesaikan masalah sekarang. Solusi lain yang saya temukan adalah menambahkan tag dasar ke halaman ujung depan (H5) saya. Saya harap ini membantu seseorang di luar sana.Bersulang
sumber
Solusi ini berlaku jika:
RestController
tetapi tidakController
.Anda tidak menggunakan Spring Data Rest.
}
Ini mirip dengan solusi yang diposting oleh mh-dev, tetapi menurut saya ini sedikit lebih bersih dan ini harus didukung pada versi apa pun dari Spring Boot 1.4.0+, termasuk 2.0.0+.
sumber
Per dokumen REST Data Musim Semi , jika menggunakan application.properties , gunakan properti ini untuk menyetel jalur dasar Anda:
Tetapi perhatikan bahwa Spring menggunakan ikatan santai , sehingga variasi ini dapat digunakan:
... atau yang ini jika Anda lebih suka:
Jika menggunakan application.yml , Anda akan menggunakan titik dua untuk pemisah kunci:
(Sebagai referensi, tiket terkait dibuat pada Maret 2018 untuk mengklarifikasi dokumen.)
sumber
server yang berfungsi.contextPath = / jalur
sumber
Anda dapat membuat anotasi khusus untuk pengontrol Anda:
Gunakan ini sebagai ganti @RestController biasa pada kelas pengontrol Anda dan anotasi metode dengan @RequestMapping.
Berfungsi dengan baik di Spring 4.2!
sumber