POI——CTPhoneticRun异常解决

来源:互联网 发布:淘宝解绑不了支付宝 编辑:程序博客网 时间:2024/05/13 09:05

java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTPhoneticRun

在JAVA,WEB项目中使用POI的XSSFSheet时抛出如下异常:

Caused by: java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTPhoneticRun    at java.lang.Class.getDeclaredMethods0(Native Method)    at java.lang.Class.privateGetDeclaredMethods(Class.java:2625)    at java.lang.Class.getDeclaredMethods(Class.java:1868)    at org.codehaus.jackson.map.introspect.AnnotatedClass._addMemberMethods(AnnotatedClass.java:620)    at org.codehaus.jackson.map.introspect.AnnotatedClass.resolveMemberMethods(AnnotatedClass.java:408)    at org.codehaus.jackson.map.introspect.BasicClassIntrospector.classWithCreators(BasicClassIntrospector.java:185)    at org.codehaus.jackson.map.introspect.BasicClassIntrospector.collectProperties(BasicClassIntrospector.java:157)    at org.codehaus.jackson.map.introspect.BasicClassIntrospector.forSerialization(BasicClassIntrospector.java:96)    at org.codehaus.jackson.map.introspect.BasicClassIntrospector.forSerialization(BasicClassIntrospector.java:16)    at org.codehaus.jackson.map.SerializationConfig.introspect(SerializationConfig.java:973)    at org.codehaus.jackson.map.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:251)    at org.codehaus.jackson.map.ser.StdSerializerProvider._createUntypedSerializer(StdSerializerProvider.java:782)    at org.codehaus.jackson.map.ser.StdSerializerProvider._createAndCacheUntypedSerializer(StdSerializerProvider.java:735)    at org.codehaus.jackson.map.ser.StdSerializerProvider.findValueSerializer(StdSerializerProvider.java:344)    at org.codehaus.jackson.map.ser.impl.PropertySerializerMap.findAndAddSerializer(PropertySerializerMap.java:39)    at org.codehaus.jackson.map.ser.BeanPropertyWriter._findAndAddDynamic(BeanPropertyWriter.java:463)    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:441)    at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)    at org.codehaus.jackson.map.ser.std.MapSerializer.serializeFields(MapSerializer.java:262)    at org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:186)    at org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:23)    at org.codehaus.jackson.map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(StdContainerSerializers.java:122)    at org.codehaus.jackson.map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(StdContainerSerializers.java:71)    at org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86)    at org.codehaus.jackson.map.ser.std.MapSerializer.serializeFields(MapSerializer.java:262)    at org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:186)    at org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:23)    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:610)    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256)    at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1613)    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:200)    at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:179)    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:148)    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:90)    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:189)    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:69)    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476)    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)    at org.eclipse.jetty.server.Server.handle(Server.java:370)    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)    at java.lang.Thread.run(Thread.java:745)

抛出异常的使用情况如下:

public @ResponseBody Object getTableHead(HttpServletRequest request, @RequestParam String uploadId)            throws Exception {        Map result = new HashMap<>();        List heads = new ArrayList<>();        String fileName = eDataManageService.getTemplatePathByUploadId(uploadId);        String path = request.getSession().getServletContext().getRealPath(configInfo.getDownloadTemplatePath());        XSSFSheet sheet = XSSFReadWrite.getSheet0(new File(path + "/" + fileName));        Iterator<Cell> cellIterator = sheet.getRow(0).cellIterator();        while (cellIterator.hasNext()) {            Map map = new HashMap<>();            Cell cell = cellIterator.next();            map.put("name", cell.getStringCellValue());            map.put("code", cell.getCellComment().getString());            heads.add(map);        }        result.put("heads", heads);        result.put("replaceSelect", replaceCodeToSelect(uploadId));        return result;    }

同一段类似功能在另一处写没报错,写在这里就找不到类,不科学啊。经过仔细对比和删除代码测试,终于找到原因了。

问题出在:

map.put("code", cell.getCellComment().getString());

在另一处我使用的是String类型接收取到的值,编辑器直接就提示错误,加上了.toString()。而这里Map接收的对象是Object类型,就忽略了这一点。
改为:

map.put("code", cell.getCellComment().getString().toString());

就ok了。
最后推测和@ResponseBody Object有关,这里可能会把该方法的返回值进行序列化,以得到json对象传到页面。而这里的.getString()方法得到的是org.apache.poi.ss.usermodel.RichTextString对象,该对象序列化可能会用到org/openxmlformats/schemas/spreadsheetml/x2006/main/CTPhoneticRun吧,而引用的包可能确实没有,就出错了。

0 0
原创粉丝点击