本文介绍了不能将java.lang.String的实例反序列化为START_OBJECT令牌的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我遇到一个问题,我的可部署的jar命中一个异常,当我在IntelliJ本地运行时不会发生。 例外: 事件{id = 2,socket = 0c317829-69bf-43d6-b598-7c0c550635bb,type = getDashboard,data = {workstationUuid = ddec1caa-a97f-4922-833f-632da07ffc11},reply = true} 将getDashboard事件触发Socket#0c317829-69bf-43d6-b598-7c0c550635bb 无法调用AtmosphereFramework.doCometSupport() java.lang.IllegalArgumentException:无法反序列化java.lang.String中的实例,从START_OBJECT令牌在[资料来源:N / A;行:-1,列:-1] 在org.codehaus.jackson.map.ObjectMapper._convert(ObjectMapper.java:2502)在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)在com.github.flowersinthesand.portal.atmosphere.AtmosphereSocketFactory.onRequest(AtmosphereSocketFactory.java:75)在org.atmosphere.cpr.AsynchronousProcessor。 action(AsynchronousProcessor.java:256)在org.atmosphere.cpr.AsynchronousProcessor.suspended(AsynchronousProc essor.java:166)在org.atmosphere.container.Grizzly2WebSocketSupport.service(Grizzly2WebSocketSupport.java:75)在org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1342)在org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:219)在org.atmosphere.websocket.DefaultWebSocketProcessor $ 2.run(DefaultWebSocketProcessor.java:183)在org.atmosphere。 util.VoidExecutorService.execute(VoidExecutorService.java:101)在org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:178)在org.atmosphere.websocket.DefaultWebSocketProcessor.invokeWebSocketProtocol(DefaultWebSocketProcessor。 java:167)在org.atmosphere.container.Grizzly2WebSocketSupport $ Grizzly2WebSocketApplication.onMessage(Grizzly2WebSocketSupport.java:171)在org.glassfish.grizzly.websockets.DefaultWebSocket.onMessage(Defau ltWebSocket.java:164)在org.glassfish.grizzly.websockets.frametypes.TextFrameType.respond(TextFrameType.java:70)在org.glassfish.grizzly.websockets.DataFrame.respond(DataFrame。 java:104)在org.glassfish.grizzly.websockets.WebSocketFilter.handleRead(WebSocketFilter.java:221)在org.glassfish.grizzly.filterchain.ExecutorResolver $ 9.execute(ExecutorResolver.java:119 )在org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:265)在org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)在org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:134)在org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)在org。 glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:78)在org.glassfish.grizzly.nio.transpor t.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:770)在org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy。 run0(WorkerThreadIOStrategy.java:115)在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access $ 100(WorkerThreadIOStrategy.java:55)在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy $ WorkerThreadRunnable.run (WorkerThreadIOStrategy.java:135)在org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:551)在org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.run (AbstractThreadPool.java:531)在java.lang.Thread.run(Thread.java:781)导致:org.codehaus.jackson.map.JsonMappingException:不能反序列化java的实例。 lang.在[来源:不适用的情况下]退出START_OBJECT令牌;行:-1,列:-1] 在org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)在org.codehaus.jackson.map.deser.StdDeserializationContext。 mappingException(StdDeserializationContext.java:219)在org.codehaus.jackson.map.deser.std.StringDeserializer.deserialize(StringDeserializer.java:44)在org.codehaus.jackson.map.deser。 std.StringDeserializer.deserialize(StringDeserializer.java:13)在org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704)在org.codehaus.jackson.map.ObjectMapper。 readValue(ObjectMapper.java:1315)在org.codehaus.jackson.map.ObjectMapper._convert(ObjectMapper.java:2498) ... 34更多 java.lang.IllegalArgumentException:不能反序列化java.lang.String的实例,从[来源:N / A;]的START_OBJECT令牌行:-1,列:-1]状态500消息服务器错误 Socket Handler 我相信当JSON被解析为WorkstationRequest对象时发生异常,因为下面的项目。这是套接字处理程序: @On @Reply @JsonView({Views.WorkstationView。 class}) public WorkstationDashboard getDashboard(@Data WorkstationRequest request){返回新的WorkstationDashboard(request.getWorkstation()); } 套接字处理程序映射到的对象: public class WorkstationRequest { / *如果此工作站不存在,则实例化类* / private Class&扩展工作站> workstationClass; private WorkflowProcess workflowProcess; 私人PhysicalWorkstation工作站; WorkstationService workstationService; / ** * @param workstationClass必需的,当杰克逊映射UUID时,我们可以自动获取类 * / public WorkstationRequest(Class<?extends Workstation> ; workstationClass){ this.workstationClass = workstationClass; workstationService =(WorkstationService)ApplicationContextProvider.getApplicationContext()。getBean(workstationService); } / *根据UUID设置工作站。将工作站注册为新的* / @JsonProperty(workstationUuid) public void setWorkstation(String workstationUUID){ workstation =(PhysicalWorkstation)WorkstationService.getWorkstation(workstationUUID); //设置新工作站 if(workstation == null){ WorkstationEntity workstationEntity = workstationService.findByUUID(workstationUUID); workstation =(PhysicalWorkstation)Workstation.factory(workstationEntity,workstationClass); //注册队列 WorkflowProcessService.getWorkflowProcess(工作站).registerWorkstation(工作站); } } public PhysicalWorkstation getWorkstation(){ return workstation; } } 正在映射的JSON: {id:2,socket:0c317829-69bf-43d6-b598-7c0c550635bb,type:getDashboard数据:{workstationUuid:ddec1caa-a97f-4922-833f-632da07ffc11},回复: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工作站){ fromWorkstation(workstation); } / *从工作站填充仪表板数据* / 从工作站(Workstation工作站)的public void { 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; } } 我对于如何开始调试这个。堆栈跟踪从不触及我的应用程序。我正在使用 Maven - >包部署我的.jar并执行它与 java -jar /path-to-jar.jar 更新:为了防止这个问题难以置信,我已经在这里添加了我的pom.xml: http://pastebin.com/1ZUtKCfE 。我相信这是一个依赖问题,因为错误只发生在我的可部署的jar,而不是在我的本地PC上。解决方案重新映射这个JSON {id:2,socket:0c317829- 69bf-43d6-b598-7c0c550635bb,type:getDashboard,data:{workstationUuid:ddec1caa-a97f-4922-833f-632da07ffc11},回复:true } 一个名为 data 的元素,它具有一个JSON对象作为其值。您正在尝试将该JSON对象中名为 workstationUuid 的元素反序列化为此设置器。 @JsonProperty(workstationUuid) public void setWorkstation(String workstationUUID){ 这不会直接工作,因为Jackson看到一个JSON_OBJECT,而不是String。 尝试创建一个类数据 public class Data {//名称不重要 @JsonProperty(workstationUuid) private String workstationUuid; // getter和setter } 切换您的方法 $ b @JsonProperty(data) public void setWorkstation(Data data){ // use getter to检索它 I'm running into an issue where my deployable jar hits an exception that doesn't happen when I run this locally in IntelliJ.Exception: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-7c0c550635bbFailed 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 morejava.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 ErrorSocket HandlerI believe the exception is occurring when the JSON is parsed into a WorkstationRequest object because of the below item. This is the socket handler:@On@Reply@JsonView({Views.WorkstationView.class})public WorkstationDashboard getDashboard(@Data WorkstationRequest request) { return new WorkstationDashboard(request.getWorkstation());}The object the socket handler maps to: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; }}The JSON being mapped:{"id":2,"socket":"0c317829-69bf-43d6-b598-7c0c550635bb","type":"getDashboard","data":{"workstationUuid":"ddec1caa-a97f-4922-833f-632da07ffc11"},"reply":true}WorkstationDashboard.javapublic 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; }}I'm at quite a loss as to how to begin debugging this. The stack trace never touches my application. I'm using Maven -> Package to deploy my .jar and executing it with java -jar /path-to-jar.jarUpdate: To prevent this question from being incredibly long, I've included my pom.xml here: http://pastebin.com/1ZUtKCfE. I believe this is a dependency issue since the error only occurs on my deployable jar and not on my local PC. 解决方案 You're mapping this JSON { "id": 2, "socket": "0c317829-69bf-43d6-b598-7c0c550635bb", "type": "getDashboard", "data": { "workstationUuid": "ddec1caa-a97f-4922-833f-632da07ffc11" }, "reply": true}that contains an element named data that has a JSON object as its value. You are trying to deserialize the element named workstationUuid from that JSON object into this setter.@JsonProperty("workstationUuid")public void setWorkstation(String workstationUUID) {This won't work directly because Jackson sees a JSON_OBJECT, not a String.Try creating a class Datapublic class Data { // the name doesn't matter @JsonProperty("workstationUuid") private String workstationUuid; // getter and setter}the switch up your method@JsonProperty("data")public void setWorkstation(Data data) { // use getter to retrieve it 这篇关于不能将java.lang.String的实例反序列化为START_OBJECT令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!