Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bad Request response with name of missing field - Spring Boot

I have an API endpoint that get a name and description parameters (both are mandatory)

createSomething(@RequestParam(value = "name") String name,@RequestParam(value = "description") String description)

If the client is not providing any of these he will get 400 Bad Request

Is there a way for me to tell the client which field is missing ? give more information for the "Bad Request" response

Update: Note that the parameters must be mandatory since I want that OpenAPI will detect that these parameters are mandatory. So solutions like making then "optional" and checking inside the body of the function is not what I am looking for

like image 411
Maayan Hope Avatar asked Sep 02 '25 03:09

Maayan Hope


2 Answers

I see multiple answers but no one is specific enough.

1)

Spring by default has the capability of reporting in the error message what parameter was missing or other violations in the request.

However since spring boot version 2.3 the specific error messages are hidden, so that no sensitive information can be disclosed to the user.

You can use the property server.error.include-message: always which was the default mechanism before 2.3 version and allow spring to write error messages for you again.

2)

If you can't afford this because other sensitive info could be leaked from other exceptions, then you have to provide your own exception handler for this specific case

The following can be placed either in the same controller, or in another class marked with @ControllerAdvice

@ExceptionHandler(MissingServletRequestParameterException.class)
public ResponseEntity handleMissingParams(MissingServletRequestParameterException ex) {
    return ResponseEntity.badRequest().body(String.format("Missing parameter with name:%s", ex.getParameterName()));
}
like image 153
Panagiotis Bougioukos Avatar answered Sep 04 '25 19:09

Panagiotis Bougioukos


As @Shubam said, you can use the defaultValue attribute of @RequestParam annotation by setting the required attribute to true since both the parameters are mandatory. Here is an example of how you could do it,

private final String DEFAULT_NAME = "Default Name";
private final String DEFAULT_DESC = "Default Desc";
@RequestMapping(value = "/get", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public ResponseEntity<String> createSomething(@RequestParam(required = true, name = "name", defaultValue = "Default Name") String name,
                                   @RequestParam(required = true, name = "description", defaultValue = "Default Desc") String desc){
    if(DEFAULT_NAME.equals(name)){
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Field Name is missing");
    }
    if(DEFAULT_DESC.equals(desc)){
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Field Desc is missing");
    }
    return ResponseEntity.ok(String.format("Hello, %s!",name));
}
like image 24
mithildobarkar Avatar answered Sep 04 '25 19:09

mithildobarkar