代码之家  ›  专栏  ›  技术社区  ›  Francesco Iannazzo

在swagger ui中使用OPTIONS、HEAD、PATCH方法,但在RestController中不使用

  •  0
  • Francesco Iannazzo  · 技术社区  · 6 年前

    在我的RestController中,我只实现了GET、POST、PUT、DELETE,但是swagger也生成了OPTIONS和HEAD的方法?原因是什么? 提前谢谢。

    @RestController
    public class TimesheetRequestController {
    
    
    @Autowired
    TimesheetRepository timeRepo;
    
    
    @RequestMapping("/timesheets")
    public List<Timesheet> getTimesheets() {
    
        List<Timesheet> results = new ArrayList<>();
        timeRepo.findAll().forEach(results::add);
    
        return results;
    }
    
    @PostMapping("/timesheets")
    @ApiParam(type="Timesheet")
    public ResponseEntity<Object> createTimesheetEntry(@RequestBody Timesheet timesheet) {
    
        Timesheet savedTimesheet = timeRepo.save(timesheet);
    
        URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
                .buildAndExpand(savedTimesheet.getId()).toUri();
    
        return ResponseEntity.created(location).build();
    }
    
    @PutMapping("/timesheets")
    public ResponseEntity<Object> getTimesheetEntry(@RequestBody Timesheet timesheet, @PathVariable long id) {
    
        Optional<Timesheet> timesheetOptional = timeRepo.findById(id);
    
        if (!timesheetOptional.isPresent())
            return ResponseEntity.notFound().build();
    
        timesheet.setId(id);
    
        timeRepo.save(timesheet);
    
        return ResponseEntity.noContent().build();
    
    }
    
    @GetMapping("/timesheets/{id}")
    public Timesheet getTimesheetEntry(@PathVariable long id) {
    
        Optional<Timesheet> timesheet = timeRepo.findById(id);
    
        if (!timesheet.isPresent())
            throw new TimesheetNotFoundException("id-" + id);
    
        return timesheet.get();
    
    }
    
    @DeleteMapping("/timesheets/{id}")
    public void deleteTimesheetEntry(@PathVariable long id) {
        timeRepo.deleteById(id);
    
    }
    
    
    
    }
    

    Swagger UI

    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
    
        @Bean
        public Docket api() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("package_name"))
                    .paths(PathSelectors.any())
                    .build();
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Phenomenal One    6 年前

    像这样改变你的功能。

    @RequestMapping(path="/timesheets",method=RequestMethod.GET)
    public List<Timesheet> getTimesheets() {
    
        List<Timesheet> results = new ArrayList<>();
        timeRepo.findAll().forEach(results::add);
    
        return results;
    }
    

    或者把它改成 @GetMapping("/timesheets")

    issue .

        2
  •  0
  •   Selindek    6 年前

    虽然它被称为REST,表示4种基本操作,但HEAD和OPTIONS方法也是REST客户机常用的方法。所以Swagger也会自动列出处理这些http方法的控制器方法。

    因为您没有为此控制器方法定义任何方法参数:

    @RequestMapping("/timesheets")
    public List<Timesheet> getTimesheets() {
    
        List<Timesheet> results = new ArrayList<>();
        timeRepo.findAll().forEach(results::add);
    
        return results;
    }
    

    如果您不想允许HEAD和OPTIONS,请更改 @RequestMapping("/timesheets") @GetMapping("/timesheets")