Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSR-303 Type Checking Before Binding

model....

@Digits(integer=5, fraction=0, message="The value must be numeric and less than five digits")
private int value;

beans file....

<mvc:annotation-driven />

controller....

@RequestMapping(value = "/admin/save.htm", method = { RequestMethod.POST })
public ModelAndView saveSection(@Valid @ModelAttribute Section section, BindingResult result) {
     if(result.hasErrors())   {
         return new ModelAndView("admin/editSection", "section", section);
     }

How do I restrict "value" to just numerics? If I enter something other than a number, I get this error:

Failed to convert property value of type java.lang.String to required type java.lang.Integer for property value; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value "A" from type java.lang.String to type java.lang.Integer; nested exception is java.lang.IllegalArgumentException: Unable to parse A

I have seen a few posts mention initBinding but I'm not sure how to use it or if it will even help me out. This has to have been solved before. Is there any way to ensure that it is a number before it gets binded?

Or, if someone could post the correct messages.properties entry to override this error, that could work for me too.

I tried @Pattern but that doesn't work on ints

like image 283
oreoshake Avatar asked Nov 02 '10 23:11

oreoshake


People also ask

How do you validate a PATH variable?

Validating a PathVariable Just as with @RequestParam, we can use any annotation from the javax. validation. constraints package to validate a @PathVariable. The default message can be easily overwritten by setting the message parameter in the @Size annotation.

What is @valid annotation in Spring boot?

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.

What does @validated do?

@Validated annotation is a class-level annotation that we can use to tell Spring to validate parameters that are passed into a method of the annotated class. @Valid annotation on method parameters and fields to tell Spring that we want a method parameter or field to be validated. Hope this helps.


1 Answers

As you mentioned, you need a user-friendly message in messages.properties. You can use one of the following message codes (with different levels of selectivity):

  • typeMismatch.section.value
  • typeMismatch.value
  • typeMismatch.int
  • typeMismatch

Also, when you don't know message code, you can simply print the BindingResult - its toString() returns the full description of the binding errors.

like image 190
axtavt Avatar answered Sep 19 '22 06:09

axtavt