选项、头、补丁方法在 swagger-ui 但不是在 RestController
OPTIONS, HEAD, PATCH method in swagger-ui but not in RestController
我是 Swagger 的新手,我已经实现了一个 SwaggerConfig class 和一个 RestController。
在我的 RestController 中,我只实现了 GET、POST、PUT、DELETE,但是 swagger 还生成了 OPTIONS 和 HEAD 的方法?这是什么原因?
它们总是默认从 Swagger 生成吗?产生那些方法的原因是什么?
提前致谢。
@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 配置:
@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();
}
}
像这样更改您的函数。
@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。
虽然它被称为 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;
}
...所有未被任何其他控制器方法接受的请求(因为更严格的匹配参数)将被重定向到这里。所以 Swagger 会列出它们。
如果您不想允许 HEAD 和 OPTIONS,则将 @RequestMapping("/timesheets")
更改为 @GetMapping("/timesheets")
我是 Swagger 的新手,我已经实现了一个 SwaggerConfig class 和一个 RestController。 在我的 RestController 中,我只实现了 GET、POST、PUT、DELETE,但是 swagger 还生成了 OPTIONS 和 HEAD 的方法?这是什么原因? 它们总是默认从 Swagger 生成吗?产生那些方法的原因是什么? 提前致谢。
@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 配置:
@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();
}
}
像这样更改您的函数。
@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。
虽然它被称为 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;
}
...所有未被任何其他控制器方法接受的请求(因为更严格的匹配参数)将被重定向到这里。所以 Swagger 会列出它们。
如果您不想允许 HEAD 和 OPTIONS,则将 @RequestMapping("/timesheets")
更改为 @GetMapping("/timesheets")