【问题标题】:How to map 2 different methods from the same class to GET request in spring boot? [closed]如何在 Spring Boot 中将同一类的 2 个不同方法映射到 GET 请求? [关闭]
【发布时间】:2021-04-23 15:30:38
【问题描述】:

我使用 spring boot 在 java 中创建了一个 REST API,但是当我尝试运行它时,我得到一些错误,它已经将一个方法从一个控制器类映射到 get 方法,它不能映射另一个即使他们有不同的名字。例如:/drugs/filtered/{amount}/drugs/report 这是代码

    @RestController
    @AllArgsConstructor
    public class DrugController {
           private DrugService service;
           private DrugConverter drugConverter;

    @RequestMapping(name = "/drugs", method = RequestMethod.POST)
    public DrugDTO handleAddDrug(@RequestBody DrugDTO dto) {
        Drug addedDrug = service.addDrug(
                dto.getId(),
                dto.getName(),
                dto.getRecommendedAmount());
        return drugConverter.convertModelToDto(addedDrug);
    }

    @RequestMapping(name = "/drugs", method = RequestMethod.PUT)
    public DrugDTO handleUpdateDrug(@RequestBody DrugDTO dto) {
        Drug updated = service.updateDrug(
                dto.getId(),
                dto.getName(),
                dto.getRecommendedAmount());
        return drugConverter.convertModelToDto(updated);
    }

    @RequestMapping(name = "/drugs/{id}", method = RequestMethod.DELETE)
    public DrugDTO handleDeleteDrug(@PathVariable Integer id) {
        Drug deletedDrug = service.deleteDrug(id);
        return drugConverter.convertModelToDto(deletedDrug);
    }

    @GetMapping(name = "/drugs/{id}")
    public DrugDTO handleGetDrug(@PathVariable Integer id) {
        Drug drug = service.getDrug(id);
        return drugConverter.convertModelToDto(drug);
    }

    @GetMapping(name = "/drugs")
    public DrugsDTO handleGetAllDrugs() {
        Collection<Drug> drugs = service.getAllDrugs();
        return new DrugsDTO(drugs.stream().map(drugConverter::convertModelToDto).collect(Collectors.toSet()));
    }

    @GetMapping(name = "/drugs/filtered/{amount}")
    public DrugsDTO handleGetDrugsWithDoseBiggerThan(@PathVariable Integer amount) {
        Collection<Drug> drugs = service.getDrugsWithDoseBiggerThan(amount);
        return new DrugsDTO(drugs.stream().map(drugConverter::convertModelToDto).collect(Collectors.toSet()));
    }

    @GetMapping(name = "/drugs/report")
    public DrugsDTO handleGetDrugsWithDosesOf() {
        Collection<Drug> drugs = service.getDrugsWithDosesOf();
        return new DrugsDTO(drugs.stream().map(drugConverter::convertModelToDto).collect(Collectors.toSet()));

    }
}

这是错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'drugController' method BloodManagement.ServerSide.Controller.DrugController#handleGetDrug(Integer) to {GET []}: There is already 'drugController' bean method BloodManagement.ServerSide.Controller.DrugController#handleGetAllDrugs() mapped.

【问题讨论】:

    标签: java spring spring-boot rest


    【解决方案1】:

    尝试在所有映射上将参数 name 更改为 value

    即:

    @GetMapping(name = "/drugs")
    

    变成

    @GetMapping(value = "/drugs")
    

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 2013-07-03
      • 1970-01-01
      • 2019-03-12
      • 2020-11-08
      • 1970-01-01
      • 2015-08-19
      • 2019-11-25
      • 1970-01-01
      相关资源
      最近更新 更多