【发布时间】:2018-03-31 15:45:26
【问题描述】:
我在嵌入式模式下使用 HornetQ。
我正在尝试从发布者向消费者发送 POJO 对象:
public class Pojo implements Serializable {
private Integer id;
private String name;
private String phone;
// constructors, getters & setters
}
我的想法是将 POJO 转换为 Map 并通过 ClientMessage 发送每个属性。 (这样Consumer就可以通过POJO的属性来过滤消息了)
为了实现这一点,我正在使用 Jackson ObjectMapper。
出版商
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> pojoMap = mapper.convertValue(new Pojo(13, "name", "phone"), new TypeReference<Map<String, Object>>() {});
pojoMap.forEach(message::putObjectProperty);
producer.send(message);
消费者
consumer.setMessageHandler(message -> {
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Pojo pojo = mapper.convertValue(mapJson, Pojo.class);
});
问题是在反序列化期间(在消费者中)ObjectMapper 抛出异常:
java.lang.IllegalArgumentException: Cannot deserialize instance of 'java.lang.String' out of START_OBJECT token
at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: org.hornetq.core.example.Pojo["phone"])
...
据我了解,ObjectMapper 正在寻找“电话”值并想要一个字符串,但它找到了一个对象并崩溃了。
我该如何解决这个问题?
有其他选择吗?
我也尝试使用 Gson 代替 Jackson,但它返回相同的错误。
有趣的事实是,如果您发送一个没有任何字符串参数的对象,它可以正常工作。
(应该没有必要,但如果你愿意)在这里你可以找到以下的全部类:
【问题讨论】: