Hello there,
I want to apply request body validation to my Spring project
import jakarta.validation.constraints.*;
data class RequestBodyDTO(
@NotBlank(message = "ID is required.")
val iD: String
)
and this endpoint
import jakarta.validation.Valid
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
@RestController()
@RequestMapping("/foo")
class Handler {
@PostMapping
fun handle(@Valid @RequestBody requestBody: RequestBodyDTO): ResponseEntity<Unit> {
return ResponseEntity.ok().build()
}
}
I thought @Valid would handle it for me but actually the API consumer still gets a 400 without any error details. So the consumer doesn't know what's wrong.
After googling around I think Spring doesn't do that for me out of the box. So I created an additional class
import org.springframework.http.HttpStatus
import org.springframework.validation.FieldError
import org.springframework.web.bind.MethodArgumentNotValidException
import org.springframework.web.bind.annotation.*
@ControllerAdvice
class ValidationExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException::class)
fun handleValidationException(
exception: MethodArgumentNotValidException
): Map<String, String?> {
return exception.bindingResult.allErrors.associate { error ->
val fieldName = (error as FieldError).field
val errorMessage = error.defaultMessage
fieldName to errorMessage
}
}
}
Unfortunately the result is the same, the API consumer won't get any error details. Is something missing? Do I even need the ValidationExceptionHandler ? How do I achieve this?
Thanks! 🙂