faucamp
faucamp

Reputation: 121

Springfox Swagger adding response status 200 to POST and PUT

I am using springfox-swagger2 version 2.6.1, and it is inserting HTTP 200 response messages for PUT and POST operations automatically, despite my attempts to configure it not to do so (I do not use response status 200 for POST or PUT, but 201 and 204, respectively); see below screenshot:

enter image description here

I have seen answers to similar questions where the authors suggest adding a @ResponseStatus annotation to your controller to "fix" it, but this becomes inflexible and goes against Spring's own documentation regarding the use of ResponseEntity vs @ResponseStatus for rest APIs. Examples:

How to change the response status code for successful operation in Swagger?

and

https://github.com/springfox/springfox/issues/908

Is there any other way to force Springfox Swagger not to add this 200 OK status code?

My Docket configuration:

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
            .useDefaultResponseMessages(false)
            .select().
                    apis(RequestHandlerSelectors.any()).
                    paths(paths()).
                    build()
            .pathMapping("/")
            .apiInfo(apiInfo())
            .genericModelSubstitutes(ResponseEntity.class)
            .alternateTypeRules(newRule(
                    typeResolver.resolve(DeferredResult.class, typeResolver.resolve(ResponseEntity.class, WildcardType.class)),
                    typeResolver.resolve(WildcardType.class)
            ));

...and the actual API endpoint declaration:

@RequestMapping(method = RequestMethod.POST, produces = "application/json")
@ApiOperation(value = "Create a new enrolment", code = 201)
@ApiResponses(value = {
        @ApiResponse(code = 201, message = "New enrolment created",
                responseHeaders = @ResponseHeader(name = "Location", description = "The resulting URI of the newly-created enrolment", response = String.class))})
@ResponseStatus(HttpStatus.CREATED)
public ResponseEntity<Void> saveNewEnrolment(@ApiParam(value = "Enrolment to save", required = true) @RequestBody final Enrolment enrolment) {
    // implementation code removed; "location" header is created and returned
    return ResponseEntity.created(location).build();
}

Upvotes: 8

Views: 10028

Answers (2)

Dmitry Zinkevich
Dmitry Zinkevich

Reputation: 3518

Try adding @ResponseStatus(HttpStatus.CREATED) or @ResponseStatus(HttpStatus.NO_CONTENT) annotation. Taken from here

Upvotes: 4

Shane Rowatt
Shane Rowatt

Reputation: 2105

remove the

produces = "application/json"

part from the @RequestMapping annotation since your response is of type Void.class

Upvotes: 0

Related Questions