Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

kotlin and @Valid Spring annotation

I have an entity:

class SomeInfo(         @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) var value: String) {     var id: Long? = null } 

And controller method:

@RequestMapping(value = "/some-info", method = RequestMethod.POST) public Id create(@Valid @RequestBody SomeInfo someInfo) {        ...     } 

@Valid annotation doesn't work.

It seems Spring needs a default parameterless constructor and fancy code above becomes in something ugly (but working) like this:

class SomeInfo() {      constructor(value: String) {             this.value = value         }          @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX)          lateinit var value: String          var id: Long? = null     } 

Any good practice to make it less wordy?

Thanks.

like image 607
fasth Avatar asked Apr 09 '16 09:04

fasth


People also ask

What is the use of @valid annotation in Spring?

The @Valid annotation will tell spring to go and validate the data passed into the controller by checking to see that the integer numberBetweenOneAndTen is between 1 and 10 inclusive because of those min and max annotations.

What is the use of @valid annotation?

The @Valid annotation ensures the validation of the whole object. Importantly, it performs the validation of the whole object graph. However, this creates issues for scenarios needing only partial validation. On the other hand, we can use @Validated for group validation, including the above partial validation.

Where is @valid annotation is used to validate a form?

In controller class: The @Valid annotation applies validation rules on the provided object. The BindingResult interface contains the result of validation.

How do I validate a request body in Spring?

Validate Request parameter When creating a route with Spring, adding an annotation rule to validate the input is possible. In our case, we will apply a Regex the validate the format of the reservation's code. Now run the application and test with a bad reservation code. Launch the application and test.


2 Answers

Seems Spring needs these annotations to be applied to a field. But Kotlin will apply these annotations to the constructor parameter. Use field: specifier when applying an annotation to make it apply to a field. The following code should work fine for you.

class SomeInfo(     @field:NotNull     @field:Pattern(regexp = Constraints.EMAIL_REGEX)     var value: String ) {     var id: Long? = null } 
like image 198
Michael Avatar answered Oct 03 '22 08:10

Michael


As an alternative to Michal's answer, annotating the getter also works.

class SomeInfo(     @get:NotNull     @get:Pattern(regexp = Constraints.EMAIL_REGEX)     var value: String ) {     var id: Long? = null } 

The annoying part is, that not using @get: or @field: will annotate the constructor parameter. This is still valid kotlin code (so you don't get an error). It's just useless in these use cases.

like image 27
Andreas Sahlbach Avatar answered Oct 03 '22 09:10

Andreas Sahlbach