I have a JSON payload with the following structure ...
{
\"age\": 12
}
... which is mapped to the following class:
public c
A floating-point value will be truncated to an integer value by default from Jackson 2.6. As indicated in a previous answer, setting ACCEPT_FLOAT_AS_INT
to false
should fix your problem.
@Test(expected = JsonMappingException.class)
public void shouldFailMarshalling() throws IOException {
final String student = "{\"age\": 12.5}";
final ObjectMapper mapper = new ObjectMapper();
// don't accept float as integer
mapper.configure(ACCEPT_FLOAT_AS_INT, false);
mapper.readValue(student, Student.class);
}
Toggle off ACCEPT_FLOAT_AS_INT. You can check more details at https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features
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();
}