I’m doing a dummy app of a hostpital. The problem I’m having is that, I’m trying to verify that when a Patient is created, the fields passed are of the correct type, but whenever I POST an Int in a String field, it doesn’t fail and just transform the Int to String. The field I’m trying to make fail is “surname”, which by the definition of the Patient class, is a String.
If I do this (I pass a number to the “surname” field):
{
"name": "John",
"surname": 43,
"sickness": "headache"
}
It just transforms 43 into a String by the time its in the Controller method.
Here we have the Patient object:
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Patient implements Serializable {
private static final long serialVersionUID = 4518011202924886996L;
@Id
//TODO: posible cambiar luego la generationType
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "patient_id")
private Long id;
@Column(name = "patient_name")
@JsonProperty(required = true)
private String name;
@Column(name = "patient_surname")
@JsonProperty(required = true)
private String surname;
@Column(name = "patient_sickness")
@JsonProperty(required = true)
private String sickness;
}
And this is the controller class:
@Controller
@Path("/patient")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
public class PatientController {
@POST
@Path("")
public ResponseEntity<Object> postPatient(final Patient patient) {
ResponseEntity<Object> createdPatient = patientBusiness.createPatient(patient);
return new ResponseEntity<Patient>(createdPatient.getBody(), createdPatient.getStatusCode());
}
EDIT 1:
Following the “clues” and closing the circle of attention, I tried modifying the ObjectMapper, but my configuration isn’t applying. I’m still getting the error from above.
This is the config class:
@Configuration
public class JacksonConfig {
@Bean
@Primary
public ObjectMapper getModifiedObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ALLOW_COERCION_OF_SCALARS, false);
mapper.coercionConfigFor(LogicalType.Integer).setCoercion(CoercionInputShape.String, CoercionAction.Fail);
return mapper;
}
}
Even added the property to the application.yml, but still nothing:
spring:
jackson:
mapper:
allow-coercion-of-scalars: false
Any help is appreciated. Thx.
Advertisement
Answer
In the end I referred to this post to do a deserializer and a module to just have it along all the program, not just the field I want not to be transformed.
Disable conversion of scalars to strings when deserializing with Jackson