杰克逊不反序列化属性值

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);
      }