繁体   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