[英]Why RequestMapping annotation does't work with class in springboot application?
我正在嘗試通過示例學習springbott。 當我嘗試調用在類中定義的restcontroller時,出現404錯誤。
@RestController
@RequestMapping("/test")
public class ReservationResource {
public ResponseEntity<ReservationResponse> getAvaliableRooms(
@RequestParam(value = "checkin") @DateTimeFormat(iso = ISO.DATE) LocalDate checkin,
@RequestParam(value = "checkout") @DateTimeFormat(iso = ISO.DATE) LocalDate checkout) {
return new ResponseEntity<>(new ReservationResponse(), HttpStatus.OK);
}
}
此應用程序沒有針對/ error的顯式映射,因此您將其視為后備。 2017年美國東部時間8月16日星期三16:18:05發生意外錯誤(類型=未找到,狀態= 404)。 無訊息
但是當我嘗試如下時,它起作用了!
@RestController
public class ReservationResource {
@RequestMapping("/test")
public ResponseEntity<ReservationResponse> getAvaliableRooms(
@RequestParam(value = "checkin") @DateTimeFormat(iso = ISO.DATE) LocalDate checkin,
@RequestParam(value = "checkout") @DateTimeFormat(iso = ISO.DATE) LocalDate checkout) {
return new ResponseEntity<>(new ReservationResponse(), HttpStatus.OK);
}
}
為什么會出現這種差異? 順便說一下,我遵循一個示例,開發人員對它的定義類似於第一節!
您必須使用@RequestMapping
注釋您的方法。 如果沒有注釋,則控制器無法知道應執行哪種方法。
@RequestMapping("/test")
Class Level
@RequestMapping
Mehtod Level
Reachable = http://localhost:8080/test
@RequestMapping("/test")
Class Level
@RequestMapping("/abc")
Mehtod Level
Reachable = http://localhost:8080/test/abc
@RequestMapping("/test")
Class Level
@RequestMapping("/abc")
Mehtod Level
@RequestMapping("/def")
Mehtod Level
Reachable = http://localhost:8080/test/abc
Reachable = http://localhost:8080/test/def
因為如果在類級別使用@RequestMapping,它將不知道要執行哪個方法,因為您的類可以有多個方法
當使用注解@RestController時,意味着您的類將充當@Controller,並且默認情況下,內部定義的所有方法都將具有@ResponseBody
但是您需要為Controller內部的每個方法定義特定的路徑。
例如,您可以執行以下操作:
@RestController
@RequestMapping("/test")
public class ReservationResource {
@RequestMapping("/")
public ResponseEntity<ReservationResponse> getAvaliableRooms(
@RequestParam(value = "checkin") @DateTimeFormat(iso = ISO.DATE) LocalDate checkin,
@RequestParam(value = "checkout") @DateTimeFormat(iso = ISO.DATE) LocalDate checkout) {
return new ResponseEntity<>(new ReservationResponse(), HttpStatus.OK);
}
@RequestMapping("/second")
public ResponseEntity<ReservationResponse> getAvaliableRooms(
@RequestParam(value = "checkin") @DateTimeFormat(iso = ISO.DATE) LocalDate checkin,
@RequestParam(value = "checkout") @DateTimeFormat(iso = ISO.DATE) LocalDate checkout) {
return new ResponseEntity<>(new ReservationResponse(), HttpStatus.OK);
}
}
通過這種配置,您已經使用GET方法在/ test /中定義了一個路徑,其他的“ / test / second”也都是GET,但是由於默認,所有路徑都將以“ / test”開頭
如果決定在方法級別使用@RequestMapping,則可以修改同一類內的路徑。
例如:
@RestController
public class ReservationResource {
@RequestMapping("/test")
public ResponseEntity<ReservationResponse> getAvaliableRooms(
@RequestParam(value = "checkin") @DateTimeFormat(iso = ISO.DATE) LocalDate checkin,
@RequestParam(value = "checkout") @DateTimeFormat(iso = ISO.DATE) LocalDate checkout) {
return new ResponseEntity<>(new ReservationResponse(), HttpStatus.OK);
}
@RequestMapping("/second")
public ResponseEntity<ReservationResponse> getAvaliableRooms(
@RequestParam(value = "checkin") @DateTimeFormat(iso = ISO.DATE) LocalDate checkin,
@RequestParam(value = "checkout") @DateTimeFormat(iso = ISO.DATE) LocalDate checkout) {
return new ResponseEntity<>(new ReservationResponse(), HttpStatus.OK);
}
}
而且兩個網址都可以通過“ / test”和“ / second”訪問
/test
是控制器的類級別映射,然后為了使getAvaliableRooms()
public
方法有資格服務於請求,您需要將@RequestMapping("")
添加到getAvaliableRooms()
方法中,如下所示:
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("")
public ResponseEntity<ReservationResponse> getAvaliableRooms(
@RequestParam(value = "checkin") @DateTimeFormat(iso = ISO.DATE)
LocalDate checkin,
@RequestParam(value = "checkout") @DateTimeFormat(iso = ISO.DATE)
LocalDate checkout) {
return new ResponseEntity<>(new ReservationResponse(), HttpStatus.OK);
}
}
換句話說,您要明確地告訴Spring容器,控制器類中的哪個public
方法實際上是為服務請求而設計的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.