【问题标题】:Cannot deserialize value of type无法反序列化类型的值
【发布时间】:2023-01-25 07:11:19
【问题描述】:

我尝试创建交互式应用程序并使用套接字。 我在套接字中通过邮递员发送数据,但是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:

【问题讨论】:

  • 另外,我注意到,[Ljava.lang.String; - 太奇怪了,它看起来像断线(类型),但我不知道,为什么它会出现在这里......

标签: java spring-boot websocket jackson sockjs


【解决方案1】:

问题是,使用您发送请求的工具(我想是邮递员),您将其作为原始文本发送。所以 desirializer 期望它是一个简单的字符串,所以它不能将它转换成一个复杂的对象。

您应该已经通知控制器它收到的是一个 Json 请求,以便它可以用正确的 message body reader 解析它并将其转换为 Event 对象。

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

Content-Type: application/json

此外,这里的问题似乎是您用来发送消息的网址。此 url 似乎不代表应以 emit 结尾的控制器端点。我认为您将请求直接发送到消息代理而不是应用程序的控制器。

【讨论】:

  • 非常感谢,但它是套接字请求。我添加了 application/json,但错误仍然存​​在
  • 我不能删除这个 s*it ) Postman 不允许它
  • 已经,做了很多次
  • 我试过了不工作
  • @kepich 检查更新的答案,您使用的 url 似乎与控制器不对应。可能您是直接向代理而不是应用程序控制器发出请求。在这里查看如何使用它的示例spring.io/guides/gs/messaging-stomp-websocket
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2018-09-29
相关资源
最近更新 更多