I have a string which I’m supposed to read into an address object.
Now the string I’ll get may contain some extra fields and may not contain some fields which is declared in my Address class.
I’ve already added following annotations on my address class –
@JsonInclude(NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Address {
private String line1;
private String line2;
private String state;
private String pincode;
......
}
But while deserializing a string like this –
{“street”:”street”,”line1″:”line1″,”line2″:”line2″,”district”:”district”,”pincode”:”pincode”}, getting this error –
java.lang.IllegalArgumentException: Cannot construct instance of `Address` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"street":"street","line1":"line1","line2":"line2","district":"district","pincode":"pincode"}')
at [Source: UNKNOWN; line: -1, column: -1]
Already added following config to my object mapper –
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
false);
objectMapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES,
false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
Conversion logic –
String addressDetail = info.get("address");
Address address = objectMapper.convertValue(addressDetail, Address.class);
The error you are facing is based on objectmapper convertvalue-vs-readvalue.
Basically, what objectMapper.convertValue(addressDetail, Address.class)
tries, is to create an Address
from the single string value you pass in. It does not read the string contents and set field values. If you need to use convertValue
, then you have to create a constructor like public Address(String json){/*do mapping manually here*/}
.
The better approach however would be to use objectMapper.readValue(addressDetail, Address.class)
, as this method actually traverses the JSON string and creates an instance with the fields you have present in the string. readValue
only requires getter/setter and an no-args constructor to function
1