Space Cadet
Space Cadet

Reputation: 403

Swagger required parameter returns 500 when missing instead of 404

I have a REST endpoint that has a request parameter “myParam”. This is a required parameter without which any GET request made to this endpoint is considered a bad request. I’m using Swagger to highlight the fact that this parameter is required, as follows

@ApiParam(required = true) @RequestParam(value = "myParam") String myParam

The problem is that when I submit a GET to this endpoint via Postman the HTTP error returned is a 500 saying that the required parameter myParam is not provided. Is there any way to refactor this so that if a parameter labelled by Swagger as required is missing the response is 404 instead?

Upvotes: 0

Views: 1522

Answers (1)

user1234SI.
user1234SI.

Reputation: 1860

A solution could be creating a class and annotate it with @ControllerAdvice. This class' methods are responsible for handling specific exception passed as parameters. In your 500 error there should be an exception stack trace like "Caused by .. org.somepackage.SomeException ...".

1) You can create a custom class which contains a message and a HttpStatus code:

public class ExceptionResponse {
  private HttpStatus httpStatus;
  private String errorMessage;
  //getters;setters;
}

2) The @ControllerAdvice annotated class should look like this :

@ControllerAdvice
public class RestExceptionHandler {

@ExceptionHandler(value = SomeException.class)
public ResponseEntity<ExceptionResponse> handleMissingRequiredParameters(SomeException ex) {
    ExceptionResponse exceptionResponse = new ExceptionResponse();
    exceptionResponse.setHttpStatus(HttpStatus.BAD_REQUEST);
    exceptionResponse.setErrorMessage(ex.getMessage());
    return new ResponseEntity<>(exceptionResponse, exceptionResponse.getHttpStatus());
}
}

And now, when the SomeException is thrown, the actual response that you'll see is an ExceptionResponse JSON with a custom httpStatus and errorMessage.

Upvotes: 1

Related Questions