簡體   English   中英

Spring Boot - 模糊映射

[英]Spring Boot - Ambiguous Mapping

把我的頭發拉到這個上面,完全沒有意義

@RestController("/firmwareAShkcwdsdskl")
public class FirmwareController {
    @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Result> createNewFirmwareVersion(DetailedFirmwareVersionRequest detailedFirmwareVersionRequest) { 
    // Code Block
    }
}

@RestController("/jobs/firmwareUpgrade")
public class FirmwareUpgradeController {
    @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Result> createNewJob(DetailedFirmwareUpgradeRequest detailedFirmwareUpgradeRequest) {
    // Code Block
    }
}

嘗試使用這兩個控制器啟動我的 Spring Boot 應用程序會引發以下錯誤

Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map '/jobs/firmwareUpgrade' method 
eshepherd.admin.api.controller.FirmwareUpgradeController#createNewJob(DetailedFirmwareUpgradeRequest)
to {POST , produces [application/json]}: There is already '/firmwareAShkcwdsdskl' bean method
eshepherd.admin.api.controller.FirmwareController#createNewFirmwareVersion(DetailedFirmwareVersionRequest) mapped.

類名、方法名、請求映射和參數都是唯一的,我就是不明白。

正如您所看到的,我在嘗試各種字符串更改以使其最初正常工作時陷入了純粹的挫敗感,但如果有人能幫助我確定問題,我將不勝感激。

編輯:使用 Spring-Boot 2.2.4

正如您在自己的回答中提到的:是的,您誤解了。 這是一個容易混淆的問題。

@RestController的值是組件名稱,而不是請求映射路徑。 查看org.springframework.web.bind.annotation.RestController#value的源代碼。

它與org.springframework.stereotype.Component#valueorg.springframework.stereotype (在spring-context )中的其他人非常相似。 您現在擁有正確的注釋:

@RestController
@RequestMapping("/firmware")
public class FirmwareRestController {
    // ...
}

好的..我設法讓它編譯..我想我誤解了如何使用@RestController注釋

如果你提供

@RestController
@RequestMapping("/firmware")

代替

@RestController("/firmware")

它會建立。 我想我已經假設控制器上的默認參數會更有用,並且看起來像我從構建消息中預期的那樣工作。

希望這對某人有幫助!

該框架抱怨存在來自 2 個控制器的 post 路徑/ ,其中沒有為其中任何一個指定映射,因此它無法區分確切的路徑。

你可以試試下面的代碼:

@RestController
@RequestMapping("/firmwareAShkcwdsdskl")
public class FirmwareController {
    @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Result> createNewFirmwareVersion(DetailedFirmwareVersionRequest detailedFirmwareVersionRequest) { 
    // Code Block
    }
}


@RestController
@RequestMapping("/jobs/firmwareUpgrade")
public class FirmwareUpgradeController {
    @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Result> createNewJob(DetailedFirmwareUpgradeRequest detailedFirmwareUpgradeRequest) {
    // Code Block
    }
}

控制器級別的@RequestMapping應該為該路徑中的所有 API 定義根路徑,例如我必須創建一個與提要 API 相關的控制器,我會這樣做:

@RestController
@RequestMapping("/api/feeds")
class FeedsController {
    //Constructor inject fields here
    @Autowired
    FeedsController() {

    }

    @GetMapping("/")
    ResponseEntity<Map<String, String>> get() {
        return ResponseEntity.ok(Collections.emptyMap());
    }

    @PostMapping("/")
    ResponseEntity<Map<String, String>> post() {
        return ResponseEntity.ok(Collections.emptyMap());
    }

    /**
     * Standard way to implement delete is to soft delete
     * @return
     */
    @DeleteMapping("/")
    ResponseEntity<Map<String, String>> delete() {
        return ResponseEntity.ok(Collections.emptyMap());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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