'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 |
|---|
