Anotasi Spring @Pathvariable

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan menerangkan anotasi @PathVariable Spring .

Ringkasnya, yang @PathVariable anotasi boleh digunakan untuk mengendalikan pembolehubah template dalam permintaan URI pemetaan , dan menggunakannya sebagai parameter kaedah.

Mari lihat bagaimana menggunakan @PathVariable dan pelbagai sifatnya.

2. Pemetaan Ringkas

Kes penggunaan mudah dari anotasi @PathVariable akan menjadi titik akhir yang mengenal pasti entiti dengan kunci utama:

@GetMapping("/api/employees/{id}") @ResponseBody public String getEmployeesById(@PathVariable String id) { return "ID: " + id; }

Dalam contoh ini, kami menggunakan anotasi @PathVariable untuk mengekstrak bahagian templat URI yang diwakili oleh pemboleh ubah {id} .

Permintaan GET yang mudah kepada / api / karyawan / {id} akan memanggil getEm EmployeesById dengan nilai id yang diekstrak:

//localhost:8080/api/employees/111 ---- ID: 111

Sekarang, mari kita selidiki penjelasan ini lebih jauh dan lihatlah atributnya.

3. Menentukan Nama Pembolehubah Jalan

Dalam contoh sebelumnya, kami melewati menentukan nama pemboleh ubah jalur templat kerana nama untuk parameter kaedah dan pemboleh ubah jalur adalah sama.

Walau bagaimanapun, jika nama pemboleh ubah jalan berbeza, kita dapat menentukannya dalam argumen anotasi @PathVariable :

@GetMapping("/api/employeeswithvariable/{id}") @ResponseBody public String getEmployeesByIdWithVariableName(@PathVariable("id") String employeeId) { return "ID: " + employeeId; }
//localhost:8080/api/employeeswithvariable/1 ---- ID: 1

Kita juga dapat menentukan nama pemboleh ubah jalur sebagai @PathVariable (nilai = "id") dan bukan PathVariable ("id") untuk kejelasan.

4. Pembolehubah Pelbagai Laluan dalam Permintaan Tunggal

Bergantung pada kes penggunaan, kita dapat memiliki lebih dari satu pemboleh ubah jalur dalam URI permintaan kita untuk kaedah pengawal, yang juga memiliki beberapa parameter parameter :

@GetMapping("/api/employees/{id}/{name}") @ResponseBody public String getEmployeesByIdAndName(@PathVariable String id, @PathVariable String name) { return "ID: " + id + ", name: " + name; }
//localhost:8080/api/employees/1/bar ---- ID: 1, name: bar

Kami juga dapat menangani lebih dari satu parameter @PathVariable menggunakan parameter kaedah jenis java.util. Peta:

@GetMapping("/api/employeeswithmapvariable/{id}/{name}") @ResponseBody public String getEmployeesByIdAndNameWithMapVariable(@PathVariable Map pathVarsMap) { String id = pathVarsMap.get("id"); String name = pathVarsMap.get("name"); if (id != null && name != null) { return "ID: " + id + ", name: " + name; } else { return "Missing Parameters"; } }
//localhost:8080/api/employees/1/bar ---- ID: 1, name: bar

Namun, terdapat tangkapan kecil ketika menangani beberapa parameter @ PathVariable apabila rentetan pemboleh ubah jalur mengandungi watak titik (.). Kami telah membincangkan kes sudut tersebut secara terperinci di sini.

5. Pemboleh ubah Laluan Pilihan

Pada musim bunga, parameter kaedah yang dijelaskan dengan @PathVariable diperlukan secara lalai:

@GetMapping(value = { "/api/employeeswithrequired", "/api/employeeswithrequired/{id}" }) @ResponseBody public String getEmployeesByIdWithRequired(@PathVariable String id) { return "ID: " + id; }

Mengikut penampilannya, pengawal di atas harus mengendalikan kedua-dua / api / karyawan dengan permintaan yang diperlukan dan / api / karyawan dengan permintaan / 1 laluan permintaan. Tetapi, kerana parameter kaedah yang dijelaskan oleh @PathVariables adalah wajib secara lalai, ia tidak menangani permintaan yang dihantar ke / api / karyawan dengan jalan yang diperlukan:

//localhost:8080/api/employeeswithrequired ---- {"timestamp":"2020-07-08T02:20:07.349+00:00","status":404,"error":"Not Found","message":"","path":"/api/employeeswithrequired"}  //localhost:8080/api/employeeswithrequired/1 ---- ID: 111

Kita boleh mengatasi ini dengan dua cara.

5.1. Menetapkan @PathVariable sebagai Tidak Diperlukan

Kami boleh menetapkan harta yang diperlukan dari @PathVariable ke false untuk menjadikannya pilihan. Oleh itu, dengan mengubah contoh sebelumnya, kita kini dapat menangani versi URI dengan dan tanpa pemboleh ubah jalur:

@GetMapping(value = { "/api/employeeswithrequiredfalse", "/api/employeeswithrequiredfalse/{id}" }) @ResponseBody public String getEmployeesByIdWithRequiredFalse(@PathVariable(required = false) String id) { if (id != null) { return "ID: " + id; } else { return "ID missing"; } }
//localhost:8080/api/employeeswithrequiredfalse ---- ID missing

5.2. Menggunakan java.util. Pilihan

Sejak Spring 4.1, kami juga dapat menggunakan java.util. Opsional (tersedia di Java 8+) untuk menangani pemboleh ubah jalur yang tidak wajib:

@GetMapping(value = { "/api/employeeswithoptional", "/api/employeeswithoptional/{id}" }) @ResponseBody public String getEmployeesByIdWithOptional(@PathVariable Optional id) { if (id.isPresent()) { return "ID: " + id.get(); } else { return "ID missing"; } }

Sekarang, jika kita tidak menentukan id pemboleh ubah jalan dalam permintaan, kita mendapat respons lalai:

//localhost:8080/api/employeeswithoptional ---- ID missing 

5.3. Menggunakan Parameter Kaedah Peta Jenis

Seperti yang ditunjukkan sebelumnya, kita dapat menggunakan parameter metode tunggal jenis java.util.Map untuk menangani semua pemboleh ubah jalur dalam URI permintaan. Kami juga dapat menggunakan strategi ini untuk menangani kes pemboleh ubah jalur pilihan:

@GetMapping(value = { "/api/employeeswithmap/{id}", "/api/employeeswithmap" }) @ResponseBody public String getEmployeesByIdWithMap(@PathVariable Map pathVarsMap) { String id = pathVarsMap.get("id"); if (id != null) { return "ID: " + id; } else { return "ID missing"; } }

6. Nilai Lalai untuk @PathVariable

Out of the box, there isn't a provision to define a default value for method parameters annotated with @PathVariable. However, we can use the same strategies discussed above to satisfy the default value case for @PathVariable. We just need to check for null on the path variable.

For instance, using java.util.Optional, we can identify if the path variable is null or not. If it is null then we can just respond to the request with a default value:

@GetMapping(value = { "/api/defaultemployeeswithoptional", "/api/defaultemployeeswithoptional/{id}" }) @ResponseBody public String getDefaultEmployeesByIdWithOptional(@PathVariable Optional id) { if (id.isPresent()) { return "ID: " + id.get(); } else { return "ID: Default Employee"; } }

7. Conclusion

Dalam artikel ini, kami membincangkan cara menggunakan anotasi @PathVariable Spring . Kami juga mengenal pasti pelbagai cara untuk menggunakan anotasi @PathVariable dengan berkesan agar sesuai dengan kes penggunaan yang berbeza seperti parameter pilihan dan menangani nilai lalai.

Contoh kod yang ditunjukkan dalam artikel ini juga terdapat di Github.