杰克逊不匹配输入异常

问题描述 投票:0回答:1

我正在使用 Java、JavaFX、SocketIO 和 Hibernate 为学校项目构建应用程序。

课程:

服务器:

@Entity
@Table(name = "expenses")
@Data
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Expense {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false, updatable = false)
    @CreationTimestamp
    private Date createdDateTime;

    private String name;

    @ManyToOne
    @JsonBackReference
    @JsonProperty("user")
    @JoinColumn(referencedColumnName = "id", name = "user_id")
    private User user;

    private double amount;

    @Enumerated(EnumType.STRING)
    private ExpenseType type;

    private String description;

    private String date;

    public Expense() {
    }
}

客户:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Expense {
    @JsonIgnore
    private long id;
    private String name;
    private User user;
    private double amount;

    private ExpenseType type;
    private String description;
    private LocalDate date;

    public Expense(String name, User user, double amount, ExpenseType type, String description, LocalDate date) {
        this.name = name;
        this.user = user;
        this.amount = amount;
        this.type = type;
        this.description = description;
        this.date = date;
    }
}

错误如下:

[nioEventLoopGroup-3-3] ERROR com.corundumstudio.socketio.JsonSupportWrapper - Can't read value: ["create_expense","{\"name\":\"test\",\"user\":{\"id\":1,\"createdDateTime\":\"2024-04-01T14:56:32.000+00:00\",\"username\":\"admin\",\"role\":\"ADMIN\"},\"amount\":123.0,\"type\":\"EXPENSE\",\"description\":\"\",\"date\":\"2024-04-08\"}"] for type: class com.corundumstudio.socketio.protocol.Event
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `dev.lukaslist.models.Expense` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"name":"test","user":{"id":1,"createdDateTime":"2024-04-01T14:56:32.000+00:00","username":"admin","role":"ADMIN"},"amount":123.0,"type":"EXPENSE","description":"","date":"2024-04-08"}')
 at [Source: (io.netty.buffer.ByteBufInputStream); line: 1, column: 19]
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
    at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1739)
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1364)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:311)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1504)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:197)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187)
    at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
    at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4801)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2974)
    at com.corundumstudio.socketio.protocol.JacksonJsonSupport$EventDeserializer.deserialize(JacksonJsonSupport.java:196)
    at com.corundumstudio.socketio.protocol.JacksonJsonSupport$EventDeserializer.deserialize(JacksonJsonSupport.java:157)
    at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4825)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3809)
    at com.corundumstudio.socketio.protocol.JacksonJsonSupport.readValue(JacksonJsonSupport.java:342)
    at com.corundumstudio.socketio.JsonSupportWrapper.readValue(JsonSupportWrapper.java:54)
    at com.corundumstudio.socketio.protocol.PacketDecoder.parseBody(PacketDecoder.java:294)
    at com.corundumstudio.socketio.protocol.PacketDecoder.decode(PacketDecoder.java:167)
    at com.corundumstudio.socketio.protocol.PacketDecoder.decodePackets(PacketDecoder.java:133)
    at com.corundumstudio.socketio.handler.InPacketHandler.channelRead0(InPacketHandler.java:63)
    at com.corundumstudio.socketio.handler.InPacketHandler.channelRead0(InPacketHandler.java:34)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:324)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
    at com.corundumstudio.socketio.transport.WebSocketTransport.channelRead(WebSocketTransport.java:96)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at com.corundumstudio.socketio.transport.PollingTransport.channelRead(PollingTransport.java:111)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at com.corundumstudio.socketio.handler.AuthorizeHandler.channelRead(AuthorizeHandler.java:139)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:102)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:833)
java hibernate sockets socket.io jackson
1个回答
0
投票

您正在尝试从表示值数组的 json 字符串创建

Event
(
class com.corundumstudio.socketio.protocol.Event
) 类的对象。

Can't read value: ["create_expense","{\"name\":\"test\",\"user\":{\"id\":1,\"createdDateTime\":\"2024-04-01T14:56:32.000+00:00\",\"username\":\"admin\",\"role\":\"ADMIN\"},\"amount\":123.0,\"type\":\"EXPENSE\",\"description\":\"\",\"date\":\"2024-04-08\"}"] 
for type: class com.corundumstudio.socketio.protocol.Event

该数组仅包含这两个字符串:

  • “创建_费用”
  • "{"name":"test","user":{"id":1,"createdDateTime":"2024-04-01T14:56:32.000+00:00","用户名":"admin", "角色":"管理员"},"金额":123.0,"类型":"费用","描述":"","日期":"2024-04-08"}"

我不知道您正在使用的 API,但似乎您需要获取第二个元素以从中创建

Event
的实例。

顺便说一句,您的客户的类

Event
已经使用了 Lombok 的注释
@Data
。此时注释
@Setter
@Getter
是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.