'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