杰克逊不反序列化属性值
Jackson don't deserialize properties value
我有 pojo objects 继承和泛型是这样的:
child object:
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class MessageCreatedEvent extends AbstractEvent<MessageDto> {
@JsonCreator
public MessageCreatedEvent(MessageDto data) {
super(data);
}
}
parent:
@Data
public abstract class AbstractEvent<T> {
private final UUID id = UUID.randomUUID();
private T data;
public AbstractEvent(T data) {
this.data = data;
}
}
内容持有object:
@Data
public class MessageDto implements Serializable {
private UUID id;
private String content;
// and other fields
}
和在rabbitTemplate中使用的jackson配置:
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
一开始我没有使用 @JsonCreator
属性 但是当我从 RabbitMQ 收到 json 消息并尝试在 rabbit 处理程序中反序列化时我得到了这个错误:
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of MessageCreatedEvent
(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
在此之后我添加了 @JsonCreator
但是 MessageDto object 中的属性没有设置。只有id字段填写,其他为空
你能告诉我我的配置有什么问题吗?谢谢。
编辑:
我尝试修改 pojos 并从 parent 中删除通用数据字段,并将其移至 child,现在反序列化工作正常,所以看起来 Jackson 对泛型有一些问题。有什么想法吗?
我不确定它是否有帮助,但您可能需要使用 @JsonProperty
。具体可以参考https://thepracticaldeveloper.com/2016/10/23/produce-and-consume-json-messages-with-spring-boot-amqp/
- 我在示例 spring 启动应用程序中复制了您的 classes(我没有使用 Lombok,但复制了它的行为)并执行了以下操作并正在运行
public class Testing {
public static void main(String[] args) throws
JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
MessageDto data = new MessageDto(UUID.randomUUID(),
"someContent");
MessageCreatedEvent createdEvent = new MessageCreatedEvent();
createdEvent.setData(data);
String json = objectMapper.writeValueAsString(createdEvent);
System.out.println(json);
MessageCreatedEvent fromJson =
objectMapper.readValue(json, MessageCreatedEvent.class);
System.out.println(fromJson.getData().getContent());
System.out.println(fromJson.getData().getId());
}
}
向 MessageDto
添加了无参数构造函数
向 AbstractEvent
添加了无参数构造函数
删除了以下内容为空class:
@JsonCreator
public MessageCreatedEvent(MessageDto data) {
super(data);
}
我有 pojo objects 继承和泛型是这样的:
child object:
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class MessageCreatedEvent extends AbstractEvent<MessageDto> {
@JsonCreator
public MessageCreatedEvent(MessageDto data) {
super(data);
}
}
parent:
@Data
public abstract class AbstractEvent<T> {
private final UUID id = UUID.randomUUID();
private T data;
public AbstractEvent(T data) {
this.data = data;
}
}
内容持有object:
@Data
public class MessageDto implements Serializable {
private UUID id;
private String content;
// and other fields
}
和在rabbitTemplate中使用的jackson配置:
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
一开始我没有使用 @JsonCreator
属性 但是当我从 RabbitMQ 收到 json 消息并尝试在 rabbit 处理程序中反序列化时我得到了这个错误:
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of
MessageCreatedEvent
(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
在此之后我添加了 @JsonCreator
但是 MessageDto object 中的属性没有设置。只有id字段填写,其他为空
你能告诉我我的配置有什么问题吗?谢谢。
编辑:
我尝试修改 pojos 并从 parent 中删除通用数据字段,并将其移至 child,现在反序列化工作正常,所以看起来 Jackson 对泛型有一些问题。有什么想法吗?
我不确定它是否有帮助,但您可能需要使用 @JsonProperty
。具体可以参考https://thepracticaldeveloper.com/2016/10/23/produce-and-consume-json-messages-with-spring-boot-amqp/
- 我在示例 spring 启动应用程序中复制了您的 classes(我没有使用 Lombok,但复制了它的行为)并执行了以下操作并正在运行
public class Testing {
public static void main(String[] args) throws
JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
MessageDto data = new MessageDto(UUID.randomUUID(),
"someContent");
MessageCreatedEvent createdEvent = new MessageCreatedEvent();
createdEvent.setData(data);
String json = objectMapper.writeValueAsString(createdEvent);
System.out.println(json);
MessageCreatedEvent fromJson =
objectMapper.readValue(json, MessageCreatedEvent.class);
System.out.println(fromJson.getData().getContent());
System.out.println(fromJson.getData().getId());
}
}
向
添加了无参数构造函数MessageDto
向
添加了无参数构造函数AbstractEvent
删除了以下内容为空class:
@JsonCreator public MessageCreatedEvent(MessageDto data) { super(data); }