java deployment atmosphere grizzly

No se puede deserializar la instancia de java.lang.String fuera del token START_OBJECT



deployment atmosphere (3)

Me encuentro con un problema donde mi jar desplegable golpea una excepción que no ocurre cuando ejecuto esto localmente en IntelliJ.

Excepción:

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

Controlador de Socket

Creo que la excepción se produce cuando el JSON se analiza en un objeto WorkstationRequest debido al elemento siguiente. Este es el manejador de socket:

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

El objeto al que se asigna el manejador de socket:

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

El JSON está mapeado:

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

Estoy bastante perdido en cuanto a cómo comenzar a depurar esto. El seguimiento de pila nunca toca mi aplicación. Estoy usando Maven -> Package para implementar mi .jar y ejecutarlo con java -jar /path-to-jar.jar

Actualización: para evitar que esta pregunta sea increíblemente larga, he incluido mi pom.xml aquí: http://pastebin.com/1ZUtKCfE . Creo que este es un problema de dependencia ya que el error solo ocurre en mi jar desplegable y no en mi PC local.


El contenido de los datos es muy variable, creo que la mejor forma es definirlo como "ObjectNode" y luego crear su propia clase para analizar:

Finalmente:

datos privados de ObjectNode;


Estás mapeando este JSON

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

que contiene un elemento llamado data que tiene un objeto JSON como su valor. Está intentando deserializar el elemento llamado workstationUuid de ese objeto JSON en este setter.

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

Esto no funcionará directamente porque Jackson ve un JSON_OBJECT, no un String.

Intenta crear una clase Data

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

el cambio de su método

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


Si no desea definir una clase separada para json anidado, debería ser necesario definir el objeto json anidado como JsonNode, por ejemplo:

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