2015-12-11 25 views
5

Piszę aplikację websocket wiosną ze StompJS po stronie klienta.Spring websocket @messagemapping problem de-serializacji java.lang.ClassCastException: java.util.LinkedHashMap nie można obsłużyć

Po stronie klienta Mam zamierza wysłać listę obiektów i po stronie serwera, gdy jest to mapowanie do obiektu java, to zamienia się w LinkedHashMap

Mój kod po stronie klienta jest

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

Listids wygląda

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

Lista Id obiekt wygląda

public class ListId { 

    private String path; 

    private Long id; 

    //getters and setters... 
} 

Kontroler wygląda następująco

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

     } 
} 

Więc dostać java.lang.ClassCastException: java.util.LinkedHashMap nie mogą być oddane do com.blah.ListId

Jednakże gdy zrobić to samo z normalnym Spring Controller z RestMapping działa dobrze, Czy jest coś ze sprężynami Adnotacja MessageMapping, która mapuje obiekty do java inaczej niż w tradycyjny sposób Nie jestem pewien, dlaczego nie jest przesyłany do ListID

+1

Czy możesz pokazać nam, gdzie skonfigurowano twój obiekt obiektowy? – Andreas

+0

Czy Twój ListId jest możliwy do serializacji? – Andreas

+0

Objectmapper jest skonfigurowany jako ListId nie jest możliwy do serializacji, dodałem serializację i uruchamiam ten sam problem .. – user1707141

Odpowiedz

1

Znam to pytanie już odpowiedział, ale tutaj jest inne rozwiązanie.

Aby Jackson przekonwertował twoją tablicę JSON na listę, musisz zawinąć ją w inny obiekt i serializować/deserializować ten obiekt.

Więc musisz wysłać następujący JSON do serwera

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

Lista jest zawinięty do innego obiektu.

Poniżej klasa wrapper

class ServiceRequest { 
    private List<ListId> list; 

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

i metoda wiadomość zostanie

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

     } 
    } 
} 

kod testowy

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\":\"https://stackoverflow.com/a/b/c.txt\",\"id\":12},{\"path\":\"https://stackoverflow.com/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; 
     } 
    } 

} 

wyjścia testowego

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