2017-08-16 119 views
0

我正在試着學習springbott樣本。當我試圖調用一個在類上定義的restcontroller時,我得到了404錯誤。爲什麼RequestMapping註釋在springboot應用程序中不能與類一起使用?

@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); 
    } 
} 

該應用對/錯誤沒有明確的映射,所以你看到這個作爲後備。 Wed Aug 16 16:18:05 EEST 2017 有一個意外的錯誤(type = Not Found,status = 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); 
    } 
} 

爲什麼會出現這種差異?順便說一下,開發人員將其定義爲第一部分!

回答

1

當您使用註釋@RestController意味着你的類將作爲@Controller和裏面定義的所有方法都將在默認情況下

@ResponseBody

但是您需要爲控制器內的每個方法定義特定路徑。

例如,你可以這樣做:

@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方法等「/測試/秒」也GET,但deafult都是你的路徑將以「/ 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); 
      } 
     } 

而且兩者URL將與「/測試」和「/秒」

1

,因爲如果你在類級別使用@RequestMapping它將不知道要執行哪個方法,你的類可以有多種方法

+0

但現在只有一種方法? –

1

您有@RequestMapping來註釋方法。如果沒有註釋,Controller不知道應該執行哪個方法。

@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 
+0

但現在只有一種方法? –

+0

是的,在課堂上它只是前綴url。在方法級別上,您可以定義後綴。或者離開課程級別,只需在方法級別設置您的映射。這是你的選擇 – Patrick

1

/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方法實際上是爲服務請求提供的。

相關問題