我正在使用 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)
您正在尝试从表示值数组的 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
该数组仅包含这两个字符串:
我不知道您正在使用的 API,但似乎您需要获取第二个元素以从中创建
Event
的实例。
顺便说一句,您的客户的类
Event
已经使用了 Lombok 的注释 @Data
。此时注释 @Setter
和 @Getter
是多余的。