Json 无法使用RabbitMQ构造“java.time.ZonedDateTime”的实例(不存在与默认构造类似的创建者)

Json 无法使用RabbitMQ构造“java.time.ZonedDateTime”的实例(不存在与默认构造类似的创建者),json,spring-boot,serialization,rabbitmq,deserialization,Json,Spring Boot,Serialization,Rabbitmq,Deserialization,我有三个spring应用程序,它们使用springamqp(rabbitmq)相互通信:发票服务、跟踪服务和政府服务。我已成功地从发票服务向跟踪服务发送消息 @Entity public class TrackingMessage { @Id @GeneratedValue @JsonProperty("id") private int id; @JsonProperty("carId") private int carId; @Json

我有三个spring应用程序,它们使用springamqp(rabbitmq)相互通信:发票服务、跟踪服务和政府服务。我已成功地从发票服务向跟踪服务发送消息

@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);
    }
}
下面是跟踪服务的接收器类。因此,我从invoice service收到一条消息,在处理程序类中执行一些操作后,我向政府服务发送一条跟踪消息

@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));
    }
}
下面是来自跟踪服务的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的实例(不存在像默认构造一样的创建者)

政府服务中的My MessageBrokerConfiguration和TrackingMessage类与跟踪服务中的相同。有人有主意吗

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

只需要为Jackson2JsonMessageConverter配置ObjectMapper,并注册包括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;
    }

只需要为Jackson2JsonMessageConverter配置ObjectMapper,并注册包括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;
    }