2013-10-15 12 views
27

Tôi đang gặp phải vấn đề trong đó jar triển khai của tôi truy cập ngoại lệ không xảy ra khi tôi chạy nội bộ này trong IntelliJ.Không thể deserialize ví dụ của java.lang.String ra khỏi START_OBJECT mã thông báo

Ngoại lệ:

Receiving an event {id=2, socket=0c317829-69bf-43d6-b598-7c0c550635bb, type=getDashboard, data={workstationUuid=ddec1caa-a97f-4922-833f-632da07ffc11}, reply=true} 
Firing getDashboard event to Socket#0c317829-69bf-43d6-b598-7c0c550635bb 
Failed invoking AtmosphereFramework.doCometSupport() 
java.lang.IllegalArgumentException: Can not deserialize instance of java.lang.String out of START_OBJECT token 
at [Source: N/A; line: -1, column: -1] 
     at org.codehaus.jackson.map.ObjectMapper._convert(ObjectMapper.java:2502) 
     at org.codehaus.jackson.map.ObjectMapper.convertValue(ObjectMapper.java:2468) 
     at com.github.flowersinthesand.portal.support.DefaultDispatcher$DefaultHandler$DataParam.resolve(DefaultDispatcher.java:270) 
     at com.github.flowersinthesand.portal.support.DefaultDispatcher$DefaultHandler.handle(DefaultDispatcher.java:204) 
     at com.github.flowersinthesand.portal.support.DefaultDispatcher.fire(DefaultDispatcher.java:107) 
     at com.github.flowersinthesand.portal.support.AbstractSocketFactory.fire(AbstractSocketFactory.java:73) 
     at com.github.flowersinthesand.portal.atmosphere.AtmosphereSocketFactory.onRequest(AtmosphereSocketFactory.java:75) 
     at org.atmosphere.cpr.AsynchronousProcessor.action(AsynchronousProcessor.java:256) 
     at org.atmosphere.cpr.AsynchronousProcessor.suspended(AsynchronousProcessor.java:166) 
     at org.atmosphere.container.Grizzly2WebSocketSupport.service(Grizzly2WebSocketSupport.java:75) 
     at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1342) 
     at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:219) 
     at org.atmosphere.websocket.DefaultWebSocketProcessor$2.run(DefaultWebSocketProcessor.java:183) 
     at org.atmosphere.util.VoidExecutorService.execute(VoidExecutorService.java:101) 
     at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:178) 
     at org.atmosphere.websocket.DefaultWebSocketProcessor.invokeWebSocketProtocol(DefaultWebSocketProcessor.java:167) 
     at org.atmosphere.container.Grizzly2WebSocketSupport$Grizzly2WebSocketApplication.onMessage(Grizzly2WebSocketSupport.java:171) 
     at org.glassfish.grizzly.websockets.DefaultWebSocket.onMessage(DefaultWebSocket.java:164) 
     at org.glassfish.grizzly.websockets.frametypes.TextFrameType.respond(TextFrameType.java:70) 
     at org.glassfish.grizzly.websockets.DataFrame.respond(DataFrame.java:104) 
     at org.glassfish.grizzly.websockets.WebSocketFilter.handleRead(WebSocketFilter.java:221) 
     at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
     at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:265) 
     at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
     at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:134) 
     at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 
     at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:78) 
     at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:770) 
     at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
     at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 
     at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) 
     at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:551) 
     at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:531) 
     at java.lang.Thread.run(Thread.java:781) 
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token 
at [Source: N/A; line: -1, column: -1] 
     at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) 
     at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219) 
     at org.codehaus.jackson.map.deser.std.StringDeserializer.deserialize(StringDeserializer.java:44) 
     at org.codehaus.jackson.map.deser.std.StringDeserializer.deserialize(StringDeserializer.java:13) 
     at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704) 
     at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1315) 
     at org.codehaus.jackson.map.ObjectMapper._convert(ObjectMapper.java:2498) 
     ... 34 more 
java.lang.IllegalArgumentException: Can not deserialize instance of java.lang.String out of START_OBJECT token 
at [Source: N/A; line: -1, column: -1] Status 500 Message Server Error 

Ổ cắm Handler

tôi tin rằng các ngoại lệ đang xảy ra khi JSON được phân tách thành một đối tượng WorkstationRequest vì các mục bên dưới. Đây là xử lý ổ cắm:

@On 
@Reply 
@JsonView({Views.WorkstationView.class}) 
public WorkstationDashboard getDashboard(@Data WorkstationRequest request) { 
    return new WorkstationDashboard(request.getWorkstation()); 
} 

Đối tượng xử lý ổ cắm bản đồ để:

public class WorkstationRequest { 

    /* Class to instantiate if this workstation does not already exist */ 
    private Class<? extends Workstation> workstationClass; 

    private WorkflowProcess workflowProcess; 

    private PhysicalWorkstation workstation; 

    WorkstationService workstationService; 

    /** 
    * @param workstationClass Required so when jackson maps the UUID we can auto fetch the class 
    */ 
    public WorkstationRequest(Class<? extends Workstation> workstationClass) { 
     this.workstationClass = workstationClass; 
     workstationService = (WorkstationService) ApplicationContextProvider.getApplicationContext().getBean("workstationService"); 
    } 

    /* Set the workstation based on UUID. Will register the workstation if it's new */ 
    @JsonProperty("workstationUuid") 
    public void setWorkstation(String workstationUUID) { 
     workstation = (PhysicalWorkstation)WorkstationService.getWorkstation(workstationUUID); 

     //setup new workstation 
     if (workstation == null) { 
      WorkstationEntity workstationEntity = workstationService.findByUUID(workstationUUID); 
      workstation = (PhysicalWorkstation)Workstation.factory(workstationEntity, workstationClass); 

      //register with queue 
      WorkflowProcessService.getWorkflowProcess(workstation).registerWorkstation(workstation); 
     } 
    } 

    public PhysicalWorkstation getWorkstation() { 
     return workstation; 
    } 
} 

Các JSON được ánh xạ:

{"id":2,"socket":"0c317829-69bf-43d6-b598-7c0c550635bb","type":"getDashboard","data":{"workstationUuid":"ddec1caa-a97f-4922-833f-632da07ffc11"},"reply":true} 

WorkstationDashboard.java

public class WorkstationDashboard { 
    private HashMap<String, Object> queue = new HashMap<String, Object>(); 

    private LinkedBlockingDeque<JobSetEntity> currentWork; 

    public WorkstationDashboard() { 
     queue.put("size", 0); 
    } 

    public WorkstationDashboard(Workstation workstation) { 
     fromWorkstation(workstation); 
    } 

    /* Populate dashboard data from a workstation */ 
    public void fromWorkstation(Workstation workstation) { 
     WorkflowProcess workflowProcess = WorkflowProcessService.getWorkflowProcess(workstation); 

     setCurrentWork(workstation.getCurrentWork()); 
     setQueueSize(workflowProcess.getQueue().size()); 
    } 

    public void setQueueSize(Integer queueSize) { 
     queue.put("size", queueSize); 
    } 

    public HashMap<String, Object> getQueue() { 
     return queue; 
    } 

    public LinkedBlockingDeque<JobSetEntity> getCurrentWork() { 
     return currentWork; 
    } 

    public void setCurrentWork(LinkedBlockingDeque<JobSetEntity> currentWork) { 
     this.currentWork = currentWork; 
    } 
} 

Tôi đang khá mất mát như thế nào để bắt đầu gỡ lỗi này. Dấu vết ngăn xếp không bao giờ chạm vào ứng dụng của tôi. Tôi đang sử dụng để triển khai Maven -> Package .jar của tôi và thực hiện nó với java -jar /path-to-jar.jar

Cập nhật: Để ngăn chặn vấn đề này từ là cực kỳ lâu, tôi đã bao gồm pom.xml của tôi ở đây: http://pastebin.com/1ZUtKCfE. Tôi tin rằng đây là một vấn đề phụ thuộc kể từ khi lỗi chỉ xảy ra trên jar triển khai của tôi và không phải trên máy tính cục bộ của tôi.

Trả lời

36

Bạn đang lập bản đồ JSON này

{ 
    "id": 2, 
    "socket": "0c317829-69bf-43d6-b598-7c0c550635bb", 
    "type": "getDashboard", 
    "data": { 
     "workstationUuid": "ddec1caa-a97f-4922-833f-632da07ffc11" 
    }, 
    "reply": true 
} 

có chứa một thành phần có tên data mà có một đối tượng JSON như giá trị của nó. Bạn đang cố gắng deserialize các yếu tố có tên workstationUuid từ đó đối tượng JSON vào setter này.

@JsonProperty("workstationUuid") 
public void setWorkstation(String workstationUUID) { 

Điều này sẽ không hoạt động trực tiếp vì Jackson thấy JSON_OBJECT, không phải là Chuỗi.

Hãy thử tạo một lớp Data

public class Data { // the name doesn't matter 
    @JsonProperty("workstationUuid") 
    private String workstationUuid; 
    // getter and setter 
} 

công tắc lên phương pháp của bạn

@JsonProperty("data") 
public void setWorkstation(Data data) { 
    // use getter to retrieve it 
+0

Tôi thất bại trong việc mô tả này một cách chi tiết, nhưng thư viện socket tôi m sử dụng ánh xạ trường 'dữ liệu' trong mảng đó đến đối tượng của tôi thông qua' public WorkstationDashboard getDashboard (@Data WorkstationRequest request) {'. Nó gọi 'getDashboard()' vì 'type' trong JSON đó, sau đó ánh xạ' dữ liệu'. Tôi có thể sai, vì tôi thực sự không biết chuyện gì đang diễn ra. Nhưng kể từ khi tất cả các công trình này cục bộ trên máy tính của tôi và phá vỡ khi tôi triển khai ứng dụng của tôi thông qua một .jar nó có vẻ như đó là một số loại vấn đề phụ thuộc. Pom của tôi là ở đây: http://pastebin.com/1ZUtKCfE – Webnet

+1

@Webnet là '@ Data' một chú thích tùy chỉnh liên kết trường' dữ liệu' từ JSON? Bạn sẽ phải quay lại để xem nó tạo ra đối số 'WorkstationRequest' như thế nào. –

+0

@SotiriosDelimanolis, RẮN trả lời người đàn ông. Đã lưu tôi giờ khắc phục sự cố. – icfantv

4

nội dung dữ liệu như vậy biến, tôi nghĩ rằng hình thức tốt nhất là xác định nó như là "ObjectNode" và tiếp theo tạo lớp học riêng của mình để phân tích cú pháp:

Cuối cùng:

dữ liệu ObjectNode riêng;

+1

Bạn đã tiết kiệm thời gian dài cho việc này. Trường 'data' của tôi có thể có bất kỳ JSON bên trong, vì vậy tôi không thể ánh xạ nó với một số POJO. Tôi đã tìm kiếm một số giải pháp có thể chỉ giữ giá trị JSON. Cảm ơn bạn rất nhiều. Chỉ cần kiểm tra lại, có bất kỳ tác dụng phụ hoặc hạn chế nào khi sử dụng nó không? – theGamblerRises

2

Nếu bạn không muốn xác định một lớp học riêng cho json lồng nhau, Xác định đối tượng lồng nhau json như JsonNode nên làm việc, ví dụ:

{"id":2,"socket":"0c317829-69bf-43d6-b598-7c0c550635bb","type":"getDashboard","data":{"workstationUuid":"ddec1caa-a97f-4922-833f-632da07ffc11"},"reply":true} 

@JsonProperty("data") 
    private JsonNode data; 
Các vấn đề liên quan