Json 无法使用RabbitMQ构造“java.time.ZonedDateTime”的实例(不存在与默认构造类似的创建者)
我有三个spring应用程序,它们使用springamqp(rabbitmq)相互通信:发票服务、跟踪服务和政府服务。我已成功地从发票服务向跟踪服务发送消息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
@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;
}