I have a JSON payload with the following structure:
{
"age": 12
}
It is mapped to the following class:
public class Student {
private Integer age;
public Integer getAge(){return age;}
public void setAge(Integer age){this.age = age;}
}
At the moment, if the user submits a float value for the age
, the decimals are ignored and the only the integer part is accepted. What I want to do is prevent the user from submitting a payload with a float value for the age
(see below) and throw an exception (something like "invalid JSON value for field 'age' at line 8 col 5" - as is the standard message when deserialization fails).
{
"age": 12.7 // will be truncated to 12
}
I was thinking of implementing a custom deserializer for numeric values, but I was wondering if there is a simpler way to achieve this.
The setter
method will be called when converting json string into java object using ObjectMapper
's readValue()
method where you can check for value. Look at the setter method's signature that accepts String
instead of Integer
.
sample code:
class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(String ageString) {
System.out.println("called");
try {
age = Integer.parseInt(ageString);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("age can't be in float");
}
}
}
...
try {
Student student = new ObjectMapper().readValue("{\"age\": 12.5}", Student.class);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}