'Problem with the JSON fomart on RabbitMQ Listener using Springboot

I'm trying to create a simple application using Springboot and RabboitMQ but I'm getting an error format on the RabbitMQ Listener that I can't figure out how to get rid of it. This is the error:

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct 
instance of `com.ascan.ascanflixapi.dto.NotificationDto` (no Creators, like default 
constructor, exist): no String-argument constructor/factory method to deserialize from String 
value ('NotificationDto{user_id=2, notification='string'}')
 at [Source: (String)""NotificationDto{user_id=2, notification='string'}""; line: 1, column: 
1]

I am passing the user_id and notification parameters using Postman.

Here are the classes that I'm using:

RabbitMQconnection

package com.ascan.ascanflixapi.connections;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class RabbitMQconnection {

private AmqpAdmin amqpAdmin;

public RabbitMQconnection(AmqpAdmin amqpAdmin){
    this.amqpAdmin = amqpAdmin;
}

public static final String EXCHANGE_NAME = "amq.direct";
public static final String QUEUE_GENERIC_NAME = "appGenericQueue";
public static final String QUEUE_SPECIFIC_NAME = "appSpecificQueue";
public static final String ROUTING_KEY = "messages.key";

@Bean
public DirectExchange appExchange() {
    return new DirectExchange(EXCHANGE_NAME);
}

@Bean
public Queue appQueueGeneric() {
    return new Queue(QUEUE_GENERIC_NAME);
}

@Bean
public Queue appQueueSpecific() {
    return new Queue(QUEUE_SPECIFIC_NAME);
}

@Bean
public Binding declareBindingGeneric() {
    return BindingBuilder.bind(appQueueGeneric()).to(appExchange()).with(ROUTING_KEY);
}

@Bean
public Binding declareBindingSpecific() {
    return BindingBuilder.bind(appQueueSpecific()).to(appExchange()).with(ROUTING_KEY);
}

@Bean
public RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {
    final var rabbitTemplate = new RabbitTemplate(connectionFactory);
    rabbitTemplate.setMessageConverter(producerJackson2MessageConverter());
    return rabbitTemplate;
}

@Bean
public Jackson2JsonMessageConverter producerJackson2MessageConverter() {
    return new Jackson2JsonMessageConverter();
}
  }
}

RabbitMQservice

package com.ascan.ascanflixapi.services;

import com.ascan.ascanflixapi.connections.RabbitMQconnection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;

@Service
public class RabbitmqService {
private static final Logger log = LoggerFactory.getLogger(RabbitmqService.class);

private final RabbitTemplate rabbitTemplate;

public RabbitmqService(final RabbitTemplate rabbitTemplate) {
    this.rabbitTemplate = rabbitTemplate;
}

public void sendMessage(Object message) {
    log.info("Sending message...");
    rabbitTemplate.convertAndSend(RabbitMQconnection.EXCHANGE_NAME, 
RabbitMQconnection.ROUTING_KEY, message);

    }
}

NotificationController

package com.ascan.ascanflixapi.application.controller;

import com.ascan.ascanflixapi.dto.NotificationDto;
import com.ascan.ascanflixapi.services.RabbitmqService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
@RequestMapping (value = "notification")
public class NotificationController {

@Autowired
private RabbitmqService rabbitmqService;

@PutMapping
private ResponseEntity alteraSubscription(
        @RequestBody
                NotificationDto notification
            )
        {

            this.rabbitmqService.sendMessage(notification.toString());

            return new ResponseEntity(HttpStatus.OK);


 }
}

NotificationDto

package com.ascan.ascanflixapi.dto;

import javax.validation.constraints.NotBlank;
import java.io.Serializable;

public class NotificationDto implements Serializable {

@NotBlank
public Integer user_id;

@NotBlank
public String notification;

public NotificationDto(Integer user_id, String notification) {
    this.user_id = user_id;
    this.notification = notification;
}

public Integer getUser_id() {
    return user_id;
}

public void setUser_id(Integer user_id) {
    this.user_id = user_id;
}

public String getNotification() {
    return notification;
}

public void setNotification(String notification) {
    this.notification = notification;
}

@Override
public String toString() {
    return "NotificationDto{" +
            "user_id=" + user_id +
            ", notification='" + notification + '\'' +
            '}';

}
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source