Spring WebSocket @MessageMapping 反序列化问题:java.lang.ClassCastException: java.util.LinkedHashMap 无法转换

5

我正在编写一个使用StompJS的Spring WebSocket应用程序。

在客户端,我打算发送对象列表,在服务器端将其映射为Java对象时,它会转换为LinkedHashMap。

我的客户端代码如下:

function stomball() {
         stompClient.send("/brkr/call", {}, JSON.stringify(listIds));
     }

Listids看起来像这样

[{
    "path": "/a/b/c.txt",
    "id": 12
}, {
    "path": "/a/b/c/d.txt",
    "id": 13
}]

List Id对象的样式如下:

public class ListId {

    private String path;

    private Long id;

    //getters and setters...
}

控制器的外观如下所示。
@MessageMapping("/call" )
@SendTo("/topic/showResult")
public RetObj process(List<ListId> listIds) {
   if (!listIds.isEmpty()) {
        for(ListId listId: listIds) {

        }
}

所以我得到了一个java.lang.ClassCastException:java.util.LinkedHashMap无法转换为com.blah.ListId

然而,当我使用普通的Spring Controller和RestMapping进行相同的操作时,它可以正常工作。是否有什么与Spring的MessageMapping注释相关的问题,它将对象映射到与传统方式不同的java中?我不确定为什么无法转换为ListID。


1
你能展示一下你的对象映射器在哪里配置吗? - Andreas
你的ListId是否可序列化? - Andreas
对象映射器被配置为<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" />。ListId不可序列化,我添加了序列化,但仍然遇到相同的问题... - Nikhil Das Nomula
2个回答

1

1
我知道这个问题已经得到了回答,但这里还有另一种解决方案。
为了让Jackson将你的JSON数组转换为列表,你需要将其包装在另一个对象中并对该对象进行序列化/反序列化。
因此,你需要向服务器发送以下JSON。
{
    list: [
        {
            "path": "/a/b/c.txt",
            "id": 12
        }, {
            "path": "/a/b/c/d.txt",
            "id": 13
        }
    ]
}

列表被包装到另一个对象中。
以下是包装类。
class ServiceRequest {
    private List<ListId> list;

    public List<ListId> getList() {
        if (list == null) {
            list = new ArrayList<ListId>();
        }
        return list;
    }
}

并且message方法将变为

@MessageMapping("/call" )
@SendTo("/topic/showResult")
public RetObj process(ServiceRequest request) {
    List<ListId> listIds = request.getList();
    if (!listIds.isEmpty()) {
        for(ListId listId: listIds) {

        }
    }
}

测试代码
import java.util.ArrayList;
import java.util.List;
import org.codehaus.jackson.map.ObjectMapper;

public class TestJackson {
    public static void main(String[] args) throws Exception {
        System.out.println("Started");
        String json = "{\"list\":[{\"path\":\"/a/b/c.txt\",\"id\":12},{\"path\":\"/a/b/c/d.txt\",\"id\":13}]}";

        ObjectMapper mapper = new ObjectMapper();

        ServiceRequest response = mapper.readValue(json.getBytes("UTF-8"), ServiceRequest.class);

        for(ListId listId : response.getList()) {
            System.out.println(listId.getId() + " : " + listId.getPath());
        }
    }

    public static class ServiceRequest {
        private List<ListId> list;

        public List<ListId> getList() {
            if (list == null) {
                list = new ArrayList<ListId>();
            }
            return list;
        }
    }

    public static class ListId {
        private String path;
        private String id;

        public String getPath() {
            return path;
        }
        public void setPath(String path) {
            this.path = path;
        }
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
    }

}

测试输出

Started
12 : /a/b/c.txt
13 : /a/b/c/d.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接