Невозможно создать экземпляр `java .time.ZonedDateTime` (не существует создателей, таких как конструкция по умолчанию) с использованием RabbitMQ - PullRequest
1 голос
/ 28 мая 2020

У меня есть три приложения Spring, которые общаются друг с другом с помощью spring amqp (rabbitmq): invoice-service, tracking-service и правительственная служба. Мне уже удалось отправить сообщение из службы счетов-фактур в службу отслеживания.

Ниже приведен класс Получателя из службы отслеживания. Итак, я получаю сообщение от invoice-service и после некоторых действий в классе Handler отправляю TrackingMessage в правительственную службу.

@Component
public class Receiver {

    @Autowired
    private Handler handler;

    @Autowired
    private AmqpTemplate rabbitTemplate;

    static final String exchange = "exchange-invoice";
    static final String routingKey = "key-government";

    @RabbitListener(queues = "queue-tracking")
    public void receive(CustomMessage message) {
        List<TrackingMessage> trackingMessages = handler.getCoordinatesByDates(message);
        rabbitTemplate.convertAndSend(exchange,routingKey, trackingMessages.get(0));
    }
}

Ниже представлен класс MessageBrokerConfiguration. Я использую Jackson2 Json для преобразования объекта a Java в JSON.

@Configuration
public class MessageBrokerConfiguration {

    static final String queueName = "queue-tracking";
    static final String exchange =  "exchange-invoice";
    static final String routingKey = "key-tracking";

    @Bean
    public Queue queue() {
        return new Queue(queueName);
    }

    @Bean
    public DirectExchange exchange() {
        return new DirectExchange(exchange);
    }

    @Bean
    Binding binding(Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(routingKey);
    }

    @Bean
    Handler handler(){ return new Handler();}

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

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

Ниже представлен класс TrackingMessage из службы отслеживания.

@Entity
public class TrackingMessage {

    @Id
    @GeneratedValue
    @JsonProperty("id")
    private int id;
    @JsonProperty("carId")
    private int carId;
    @JsonProperty("longitude")
    private double longitude;
    @JsonProperty("latitude")
    private double latitude;
    @JsonProperty("recordedTime")
    private ZonedDateTime recordedTime;

    public TrackingMessage() {
    }

    public TrackingMessage(int carId, double latitude, double longitude) {
        this.carId = carId;
        this.latitude = latitude;
        this.longitude = longitude;
        this.recordedTime = getTimeNow();
    }

    public TrackingMessage(@JsonProperty("id") int carId, @JsonProperty("carId") double latitude, @JsonProperty("longitude") double longitude,
                           @JsonProperty("recordedTime") ZonedDateTime recordedTime) {
        this.carId = carId;
        this.latitude = latitude;
        this.longitude = longitude;
        this.recordedTime = recordedTime;
    }

    public int getCarId() {
        return carId;
    }

    public void setCarId(int carId) {
        this.carId = carId;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public ZonedDateTime getRecordedTime() {
        return recordedTime;
    }

    public void setRecordedTime(ZonedDateTime recordedTime) {
        this.recordedTime = recordedTime;
    }

    private ZonedDateTime getTimeNow() {
        return ZonedDateTime.now(ZoneOffset.UTC);
    }
}

Ниже это класс Receiver от государственной службы. Поэтому, когда я получаю TrackingMessage в этом классе приемника, я получаю следующую ошибку:

Невозможно создать экземпляр java.time.ZonedDateTime (не существует создателей, таких как конструкция по умолчанию)

Мои классы MessageBrokerConfiguration и TrackingMessage из государственной службы выглядят так же, как в службе отслеживания. Кто-нибудь придумал?

@Component
public class Receiver {
    @RabbitListener(queues = "queue-government")
    public void receive(TrackingMessage message) {
        System.out.println(message);
    }
}

1 Ответ

0 голосов
/ 01 июня 2020

Просто необходимо настроить ObjectMapper для Jackson2JsonMessageConverter и зарегистрировать модули, включая JavaTimeModule. Ниже приведен код, который решил мою проблему.

    @Bean
    public MessageConverter jsonMessageConverter(ObjectMapper mapper) {
        return new Jackson2JsonMessageConverter(mapper);
    }

    @Bean
    public AmqpTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);

        ObjectMapper mapper =
                new ObjectMapper()
                        .registerModule(new ParameterNamesModule())
                        .registerModule(new Jdk8Module())
                        .registerModule(new JavaTimeModule());
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        mapper.setDateFormat(new StdDateFormat());

        rabbitTemplate.setMessageConverter(jsonMessageConverter(mapper));
        return rabbitTemplate;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...