2013-10-15 17 views
27

Yerleştirilebilir kavanoğumun IntelliJ'te yerel olarak çalıştırdığımda gerçekleşmeyen bir özel duruma ulaştığı bir sorunla karşılaşıyorum.java.lang.String örneğinin başlatılamıyor START_OBJECT belirteci

İstisna:

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 

Soket Handler

JSON çünkü aşağıda öğenin bir WorkstationRequest nesnesine ayrıştırılır zaman istisna oluştuğu inanıyoruz. JSON haritası çıkarılan

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

:

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

soket işleyicisi eşleştiren nesne:

{"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; 
    } 
} 
Bu soket işleyicisi olan

Bunu hata ayıklamaya nasıl başlayacağımı bilmiyorum. Yığın izi, uygulamama asla dokunmaz. Benim .jar dağıtmak için Maven -> Package kullanarak ve java -jar /path-to-jar.jar

Update ile onu infaz ediyorum: http://pastebin.com/1ZUtKCfE: inanılmaz uzun olmaktan bu soruyu önlemek için, burada benim pom.xml ekledik. Bu bir bağımlılık sorunu olduğuna inanıyorum çünkü hata sadece benim yerel PC'mde değil, yerleştirilebilir kavanozumda gerçekleşir.

cevap

36

Bunu değeri olarak bir JSON nesnesi vardır data adında bir öğe içeren bu JSON

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

haritalama ediyoruz. Bu JSON nesnesinden workstationUuid adlı öğeyi bu diziye koymaya çalışıyorsunuz.

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

Bu, doğrudan çalışmayacaktır çünkü Jackson bir String değil JSON_OBJECT görüyor.

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

ben ayrıntılı bir şekilde açıklamanız başaramadı, ama Soket kütüphanesi I' Bu dizideki 'data 'alanını haritalara kullanarak' public WorkstationDashboard getDashboard (@Data WorkstationRequest isteği) aracılığıyla {'. Bu JSON'da 'type' nedeniyle getDashboard() işlevini çağırır, daha sonra' data' ı eşler. Yanılıyor olabilirim, çünkü neler olduğunu gerçekten bilmiyorum. Ama bu benim PC'mde yerel olarak çalışıyor ve uygulamanızı bir .jar aracılığıyla dağıttığımda kırılıyor çünkü bir çeşit bağımlılık sorunu gibi görünüyor. Benim pompam burada: http://pastebin.com/1ZUtKCfE – Webnet

+1

@Webnet Is '@ data' alan kodunu JSON'dan alan özel bir açıklama mı? 'WorkstationRequest' argümanını nasıl oluşturduğunu görmek için geri izlemeniz gerekecek. –

+0

@SotiriosDelimanolis, SOLID cevap adamı. Bana sorun giderme saatleri kaydedildi. – icfantv

4

Veri içeriği, ben iyi formu "ObjectNode" olarak tanımlamaktır, öyle değişken düşünüyorum bir sınıf Data

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

anahtarı yukarı yöntem oluşturmayı deneyin ve sonraki oluşturmak kendi sınıf ayrıştırmak için: Nihayet

:

özel ObjectNode verileri; Eğer JsonNode, örneğin işe gerektiği gibi iç içe json nesnesi tanımlama, iç içe json için ayrı bir sınıf tanımlamak istemiyorsanız

+1

Bunun için uzun kovalamamı kurtardın. "Verilerim" alanın içinde herhangi bir JSON olabilir, bu yüzden bazı POJO'larla eşleyemiyorum. Sadece JSON değerini tutabilen bir çözüm arıyordum. Çok teşekkür ederim. Sadece iki kez kontrol etmek için, kullanmanın herhangi bir yan etkisi veya dezavantajları var mı? – theGamblerRises

2

:

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

@JsonProperty("data") 
    private JsonNode data; 
İlgili konular