【问题标题】:Spring websocket @messagemapping de-serialization issue java.lang.ClassCastException: java.util.LinkedHashMap cannot be castSpring websocket @messagemapping 反序列化问题 java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast
【发布时间】:2015-12-11 19:51:54
【问题描述】:

我正在客户端用 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 cannot be cast to com.blah.ListId

但是,当我使用带有 RestMapping 的普通 Spring Controller 执行相同操作时,它工作正常,Springs MessageMapping 注释是否有任何东西可以将对象映射到 java 与传统方式不同 我不确定为什么不投射到 ListID

【问题讨论】:

  • 您能告诉我们您的 objectmapper 的配置位置吗?
  • 您的 ListId 是否可序列化?
  • objectmapper 配置为 ListId 不可序列化,我添加了序列化并遇到同样的问题..

标签: java stomp spring-websocket stompjs


【解决方案1】:

我将它从 List 更改为 Array 并且它有效!这就是我所做的

@MessageMapping("/call" )
@SendTo("/topic/showResult")
public RetObj process(ListId[] listIds) {
   if (!listIds.isEmpty()) {
        for(ListId listId: listIds) {

       }
}

感谢这个问题ClassCastException: RestTemplate returning List<LinkedHashMap> instead of List<MymodelClass>

【讨论】:

    【解决方案2】:

    我知道这个问题已经得到解答,但这里有另一个解决方案。

    要让 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;
        }
    }
    

    消息方法会变成

    @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
    

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 1970-01-01
      • 2011-04-20
      • 2015-04-09
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      相关资源
      最近更新 更多