Spring boot @Valid on requestBody in controller method not working
Solution 1
[Edited] This also worked for me (adding field annotation on constructor arguments) as answered by one of the user:
import javax.validation.constraints.Min
import javax.validation.constraints.NotBlank
class Person (
@field:NotBlank
val name : String,
@field:Min(18)
val age : Int
)
Though changing the "kotlin" class definition of Person as below (constructor arguments to no-arguments) (note parentheses (...) to curly-brackets{...}) also worked without putting @field annotaion:
import javax.validation.constraints.Min
import javax.validation.constraints.NotBlank
class Person {
@NotBlank
lateinit var name: String
@Min(18)
var age: Int = 0
}
Solution 2
Don't mark Person as a Spring @Component.
Correct way to achieve field validation is to add @field to your properties. Example code:
class SomeRequest(
@field:NotBlank val name: String
)
This happens because Spring Boot needs this annotations to be applied on fields. Kotlin by default applied them to constructor parameter. See Annotation use-site targets on Kotlin documentation.
Solution 3
In my case in order for @Valid @RequestBody to work in the springboot application it was necessary to use both dependencies
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
Manishoaham
Updated on July 27, 2022Comments
-
Manishoaham almost 2 years
I am trying to validate a simple request body annotated by @Valid annotation in a @RestController annotated by @Validated. Validations are working correctly on primitive variable in request (on age in below example) but not working on pojo request body. @Valid annotation has no effect on request body Person class (i.e. controller accepting blank name and age under 18).
Person class:
import javax.validation.constraints.Min import javax.validation.constraints.NotBlank class Person ( @NotBlank val name : String, @Min(18) val age : Int )
Controller class:
import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RestController import javax.validation.Valid @RestController @Validated class HomeController { @GetMapping("/{age}") fun verifyAge(@PathVariable("age") @Min(18) age:Int): String { return "Eligible age." } @PostMapping fun personValidation(@Valid @RequestBody person : Person) : String { return "No validation error" } }
@NotBlank, @Min and @Valid annotations came from below dependency:
implementation("org.springframework.boot:spring-boot-starter-validation:2.3.0.RELEASE")
How to make @Valid working on Person request body in a @Validated controller?