jackson 无法反序列化类型的值

xdyibdwo  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(274)

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

e5njpo68

e5njpo681#

问题是,用你发送请求的工具(我假设是 Postman )你把它作为原始文本发送。所以desirializer期望它是一个简单的String,所以它不能把它转换成复杂的对象。
您应该通知控制器它接收到的是一个Json请求,以便它可以使用正确的message body reader解析该请求,并将其转换为Event对象。
为此,请在您的请求中使用以下标题

Content-Type: application/json

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

相关问题