2

I am using javax validations in my controller with @Valid @RequestBody. When the server receives invalid data it throws error but I want to handle that error and return custom formatted error. I am unable to catch exception in my controller advice. I am using spring webFlux so can't use the bindingResult. How can I handle that exception? Here is my code

Controller

    @PostMapping
    fun createPerson(@Valid @RequestBody resource: PersonResource): Mono<Person> {
        return personService.save(resource.toPerson())
    }

Resource

data class PersonResource(
    val id: String?,

    @field:NotEmpty
    val name: String,
    ...
}

ErrorHandler

@ControllerAdvice
class ApiErrorHandler {
  @ExceptionHandler(IllegalArgumentException::class)
    fun handleValidationErrors(e: IllegalArgumentException): ResponseEntity<*> {
    // never reaches here
  }
}
Kyser Soze
  • 33
  • 3
  • Maybe this https://stackoverflow.com/a/48508749/9164471 solution will work for you. Declare the parameter as Mono and handle the error with doOnError() – Rene Jul 02 '18 at 05:37

1 Answers1

1

I think you are catching a different exception. I am using @ControllerAdvice to catch WebExchangeBindException as validation errors and it worked for me.

A specialization of ServerWebInputException thrown when after data binding and validation failure. Implements BindingResult (and its super-interface Errors) to allow for direct analysis of binding and validation errors.

choasia
  • 10,404
  • 6
  • 40
  • 61