'MappingJackson2MessageConverter Cannot Construct Instance of POJO Class
I'm trying to send a message to a web socket topic in Spring using MappingJackson2MessageConverter.
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
webSocketStompClient.setMessageConverter(converter);
However, I get the error:
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.deli.jacksonmapper.OrderMapper` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"email":"[email protected]","firstName":"Test","lastName":"Tests","phoneNumber":"090338827772","address":"The Metaverse","orderMethod":"DELIVERY"}')
at [Source: (byte[])""{\"email\":\"[email protected]\",\"firstName\":\"Test\",\"lastName\":\"Tests\",\"phoneNumber\":\"090338827772\",\"address\":\"The Metaverse\",\"orderMethod\":\"DELIVERY\"}""; line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) ~[jackson-databind-2.13.1.jar:2.13.1]
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1728) ~[jackson-databind-2.13.1.jar:2.13.1]
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1353) ~[jackson-databind-2.13.1.jar:2.13.1]
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:311) ~[jackson-databind-2.13.1.jar:2.13.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1495) ~[jackson-databind-2.13.1.jar:2.13.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:196) ~[jackson-databind-2.13.1.jar:2.13.1]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:186) ~[jackson-databind-2.13.1.jar:2.13.1]
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322) ~[jackson-databind-2.13.1.jar:2.13.1]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4674) ~[jackson-databind-2.13.1.jar:2.13.1]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3723) ~[jackson-databind-2.13.1.jar:2.13.1]
at org.springframework.messaging.converter.MappingJackson2MessageConverter.convertFromInternal(MappingJackson2MessageConverter.java:223) ~[spring-messaging-5.3.15.jar:5.3.15]
... 15 common frames omitted
This is my POJO class
private String email;
private String firstName;
private String lastName;
private String phoneNumber;
private String address;
private String orderMethod;
private List<OrderItemMapper> items;
public OrderMapper() {
super();
}
/**
* @param email
* @param firstName
* @param lastName
* @param phoneNumber
* @param address
* @param orderMethod
* @param items
*/
public OrderMapper(String email, String firstName, String lastName, String phoneNumber, String address,
String orderMethod, List<OrderItemMapper> items) {
super();
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
this.phoneNumber = phoneNumber;
this.address = address;
this.orderMethod = orderMethod;
this.items = items;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getOrderMethod() {
return orderMethod;
}
public void setOrderMethod(String orderMethod) {
this.orderMethod = orderMethod;
}
public List<OrderItemMapper> getItems() {
return items;
}
public void setItems(List<OrderItemMapper> items) {
this.items = items;
}
}
This is the nested "items" object POJO class
public class OrderItemMapper {
private String item;
private int quantity;
private double price;
public OrderItemMapper() {
}
/**
* @param item
* @param quantity
*/
public OrderItemMapper(String item, int quantity, double price) {
super();
this.item = item;
this.quantity = quantity;
this.price = price;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
Lastly, this is how I construct the JSON
private String getOrder() {
StringBuilder sb = new StringBuilder();
sb.append("{\"email\":\"[email protected]\",\"firstName\":\"Test\",");
sb.append("\"lastName\":\"Tests\",\"phoneNumber\":\"090338827772\",");
sb.append("\"address\":\"The Metaverse\",\"orderMethod\":\"DELIVERY\"}");
sb.append("\"items\":[{\"item\":\"Pizza\",\"price\":1000,");
sb.append("\"quantity\":2},{\"item\":\"Burger\",\"price\":1200,");
sb.append("\"quantity\":3}]}");
return sb.toString();
}
When I send JSON from my react front end, It works perfectly.
Deserializing manually also works perfectly. Like this:
OrderMapper om = new ObjectMapper().readValue(json, OrderMapper.class);
Any help would be appreciated.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
