无法反序列化类型的值

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

我尝试创建交互式应用程序并使用套接字。 我通过邮递员在套接字中发送数据,但SpringBoot无法反序列化它。请帮忙)

我的dto

public class Event {
    @JsonProperty("eventType")
    private String eventType;

    public Event(String eventType) {
        this.eventType = eventType;
    }

    public String getEventType() {
        return eventType;
    }

    @Override
    public String toString() {
        return "Event{" +
                "eventType='" + eventType + '\'' +
                '}';
    }
}

控制器

@Controller
public class GameController {

    @MessageMapping("/emit")
    @SendTo("/topic/events")
    public Event emitEvent(Event event) {
        return event;
    }
}

错误

2022-02-23 16:19:41.359 ERROR 12468 --- [nio-8080-exec-6] s.w.s.s.t.s.WebSocketServerSockJsSession : Broken data received. Terminating WebSocket connection abruptly

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `[Ljava.lang.String;` from Object value (token `JsonToken.START_OBJECT`)
 at [Source: (String)"{
    "eventType": "TestData"
}"; line: 1, column: 1]

更新1:

java spring-boot websocket jackson sockjs
1个回答
0
投票

问题是,使用发送请求的工具(我想是邮递员),您将其作为原始文本发送。因此反序列化器期望它是一个简单的字符串,因此它无法将其转换为复杂的对象。

你应该告知控制器它收到的是一个 Json 请求,这样它就能用正确的

message body reader
解析它,并将其转换为
Event
对象。

为此,请在您发出的请求中使用以下标头

Content-Type: application/json

此外,这里的问题似乎是您用来发送消息的网址。这个 url 似乎并不代表应该以

emit
结尾的控制器端点。我认为您将请求直接发送到消息代理而不是应用程序的控制器。

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