簡體   English   中英

為什么RequestMapping注釋不適用於springboot應用程序中的類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM