สร้างสองวิธีสำหรับรูปแบบ url เดียวกันโดยมีอาร์กิวเมนต์ต่างกัน


93

ฉันมีสถานการณ์ที่หนึ่ง url "serachUser" อาจมาพร้อมกับค่า userId หรือ UserName ที่แตกต่างกันสองค่า

ด้วยเหตุนี้ฉันจึงสร้างสองวิธี

public String searchUserById(@RequestParam long userID, Model model) 
public ModelAndView searchUserByName(@RequestParam String userName)

แต่ฉันได้รับข้อยกเว้นพบการแมปที่ไม่ชัดเจน สปริงมีวิธีใดในการจัดการกับสถานการณ์นี้

คำตอบ:


197

คุณสามารถใช้paramsพารามิเตอร์เพื่อกรองตามพารามิเตอร์ HTTP ในกรณีของคุณมันจะเป็นดังนี้:

@RequestMapping(value = "/searchUser", params = "userID")
public String searchUserById(@RequestParam long userID, Model model) {
  // ...
}

@RequestMapping(value = "/searchUser", params = "userName")
public ModelAndView searchUserByName(@RequestParam String userName) {
  // ...
}

อีกวิธีหนึ่งที่ฉันจัดการกับสิ่งนี้คือการยอมรับพารามิเตอร์เป็น String จากนั้นเรียก Long.parseLong () บนมัน หากแยกวิเคราะห์ก็จะเป็น userId หากไม่เป็นเช่นนั้นให้ถือว่าชื่อผู้ใช้
CodeChimp

9
ในกรณีที่คุณต้องการทราบว่ามันทำงานอย่างไรเมื่อคุณมีparams = { "storeId", "containerLabel" }
พารามิเตอร์

หากการแมป url และพารามิเตอร์อื่น ๆ เหมือนกันจะให้ข้อยกเว้นเวลาในการปรับใช้หรือไม่
Janath

แต่จะเป็นไปได้หรือไม่ที่จะกำหนดบทบาท / หน้าที่ที่แตกต่างกันให้กับ URL นี้เพื่ออนุญาต
Kanagavelu Sugumar

2
ที่เกี่ยวข้อง: Swagger อาจไม่รองรับสิ่งนี้อย่างเต็มที่ ผมพบว่าปัญหานี้github.com/springfox/springfox/issues/1828 ฉันใช้ Spring Fox 2.7.0 และ Swagger UI แสดงเพียง 1 วิธีแทนที่จะเป็น 2 เห็นได้ชัดว่าสิ่งนี้สามารถแก้ไขได้โดยenableUrlTemplating(true)ใช้ Swagger UI แบบทดลอง: springfox.github.io/springfox/docs/current/…
Stephanie

0

วิธีใดก็ได้ในกรณีของการร้องขอ param null ได้รับอนุญาตหากคุณไม่ส่งผ่านค่าใด ๆ มันจะเป็นโมฆะคุณสามารถเขียน coad ของคุณได้เช่น:

@RequestMapping(value = "/searchUser", params = {"userID","userName"})
public String searchUserById(@RequestParam long userID,@RequestParam String 
userName, 
Model model) {    
if(userID != null){
//..
}else{
// ...
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.