Jackson无法反序列化(Spring的云溪Kafka)

yshpjwxd  于 2022-11-08  发布在  Spring
关注(0)|答案(2)|浏览(195)

我试图读取Kafka的一条json消息,但遇到了一个异常,它说Jackson不能将json反序列化为POJO。
json类似于{"code":"500","count":22,"from":1528343820000,"to":1528343880000},是Kafka流的输出。
POJO声明了json的所有属性,并且是产生json消息的完全相同的POJO,所以我不知道为什么会发生这种情况。
我用的是Spring Cloud流2.0.0.RELEASE。
任何帮助都将不胜感激。谢谢。

  • 你好
  1. public class CodeCount {
  2. private String code;
  3. private long count;
  4. private Date from;
  5. private Date to;
  6. @Override
  7. public String toString() {
  8. return "CodeCount [code=" + code + ", count=" + count + ", from=" + from + ", to=" + to + "]";
  9. }
  10. public CodeCount(String code, long count, Date from, Date to) {
  11. super();
  12. this.code = code;
  13. this.count = count;
  14. this.from = from;
  15. this.to = to;
  16. }
  17. public String getCode() {
  18. return code;
  19. }
  20. public void setCode(String code) {
  21. this.code = code;
  22. }
  23. public long getCount() {
  24. return count;
  25. }
  26. public void setCount(long count) {
  27. this.count = count;
  28. }
  29. public Date getFrom() {
  30. return from;
  31. }
  32. public void setFrom(Date from) {
  33. this.from = from;
  34. }
  35. public Date getTo() {
  36. return to;
  37. }
  38. public void setTo(Date to) {
  39. this.to = to;
  40. }
  41. }

堆栈跟踪:

  1. 2018-06-07 15:18:51.572 ERROR 1 --- [container-0-C-1] o.s.integration.handler.LoggingHandler : org.springframework.messaging.converter.MessageConversionException: Could not read JSON: Cannot construct instance of `com.example.CodeCount` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
  2. at [Source: (byte[])"{"code":"500","count":22,"from":1528343820000,"to":1528343880000}"; line: 1, column: 2]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.CodeCount` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
  3. at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67) ~[jackson-databind-2.9.3.jar!/:2.9.3]
  4. at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1451) ~[jackson-databind-2.9.3.jar!/:2.9.3]
  5. at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1027) ~[jackson-databind-2.9.3.jar!/:2.9.3]
  6. at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1275) ~[jackson-databind-2.9.3.jar!/:2.9.3]
  7. at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:325) ~[jackson-databind-2.9.3.jar!/:2.9.3]
  8. at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159) ~[jackson-databind-2.9.3.jar!/:2.9.3]
  9. at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4001) ~[jackson-databind-2.9.3.jar!/:2.9.3]
  10. at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3109) ~[jackson-databind-2.9.3.jar!/:2.9.3]
  11. at org.springframework.messaging.converter.MappingJackson2MessageConverter.convertFromInternal(MappingJackson2MessageConverter.java:221) ~[spring-messaging-5.0.6.RELEASE.jar!/:5.0.6.RELEASE]
  12. ... 37 common frames omitted
kuuvgm7e

kuuvgm7e1#

Jackson需要访问默认构造函数来反序列化,将默认构造函数添加到pojo,即:

  1. public CodeCount() {
  2. }
eimct9ow

eimct9ow2#

你可以注解现有的构造函数和参数,Jackson将使用这个:

  1. @JsonCreator
  2. public CodeCount(@JsonProperty("code") String code,
  3. @JsonProperty("count") long count,
  4. @JsonProperty("from") Date from,
  5. @JsonProperty("to") Date to) {
  6. super();
  7. this.code = code;
  8. this.count = count;
  9. this.from = from;
  10. this.to = to;
  11. }

传递日期可能会使它有点复杂,但它肯定仍然是可能的。

相关问题