OPTIONS, HEAD, PATCH метод в Swagger-UI, но не в RestController - PullRequest
0 голосов
/ 14 октября 2018

Я новичок в использовании Swagger. Я реализовал класс SwaggerConfig и один 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 UI

Вот мой конфиг 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();
    }
}

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Хотя он называется REST и относится к четырем основным операциям, методы 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")

0 голосов
/ 14 октября 2018

Измените свою функцию следующим образом.

@RequestMapping(path="/timesheets",method=RequestMethod.GET)
public List<Timesheet> getTimesheets() {

    List<Timesheet> results = new ArrayList<>();
    timeRepo.findAll().forEach(results::add);

    return results;
}

или даже измените ее на @GetMapping("/timesheets")

Эта похожа на эту проблему .

...