我对JasperReport类对象的反序列化有问题。 如果我在简单的Java应用程序中执行此操作,则不会有问题。在我的业务开发环境(JBoss Fuse + Spring)中,完全相同的代码不起作用。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject((JasperReport) JRLoader.loadObject(new File("C:\\Users\\myName\\Desktop\\A.jasper")));
byte b[] = bos.toByteArray();
out.close();
bos.close();
JasperReport h2;
ByteArrayInputStream bis = new ByteArrayInputStream(b);
ObjectInputStream in = new ObjectInputStream(bis);
try {
h2 = (JasperReport) in.readObject(); //EXCEPTION HERE!
} catch (ClassNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
错误:
java.lang.ClassNotFoundException: net.sf.jasperreports.engine.design.JRReportCompileData位于 java.net.URLClassLoader.findClass(URLClassLoader.java:382)在 java.lang.ClassLoader.loadClass(ClassLoader.java:424)在 java.lang.ClassLoader.loadClass(ClassLoader.java:357)在 org.apache.felix.framework.BundleWiringImpl.doImplicitBootDelegation(BundleWiringImpl.java:1763) 在 org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1698) 在 org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1534) 在 org.apache.felix.framework.BundleWiringImpl.access $ 400(BundleWiringImpl.java:77) 在 org.apache.felix.framework.BundleWiringImpl $ BundleClassLoader.loadClass(BundleWiringImpl.java:1993) 在java.lang.ClassLoader.loadClass(ClassLoader.java:357)在 java.lang.Class.forName0(本机方法),位于 java.lang.Class.forName(Class.java:348)在 java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:686)在 java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1868) 在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042) 在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573) 在 java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287) 在 java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069) 在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573) 在java.io.ObjectInputStream.readObject(ObjectInputStream.java:431) 在 mypackage.controller.RESTService.testSerialize(RESTService.java:291) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)在 org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180) 在 org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) 在org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:189) 在org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:99)处 org.apache.cxf.interceptor.ServiceInvokerInterceptor $ 1.run(ServiceInvokerInterceptor.java:59) 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96) 在 org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) 在 org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 在 org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:254) 在 org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:234) 在 org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:70) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1129) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1065) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 在 org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 在org.eclipse.jetty.server.Server.handle(Server.java:499)处 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) 在 org.eclipse.jetty.io.AbstractConnection $ 2.run(AbstractConnection.java:544) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) 在 org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run(QueuedThreadPool.java:555) 在java.lang.Thread.run(Thread.java:748)
我在Fuse上添加了Jasper库。 在新的标准Java项目中,完全相同的代码可以正常工作。
谢谢, 路易吉
更新: 我做了其他测试。问题不在于序列化,因为即使试图编译以字符串形式存在的JRXML,我也会崩溃。 我在JBoss Fuse和JBoss EAP上进行了测试,但是它不起作用。 SpringBoot上的代码完全相同。
ByteArrayInputStream bais = new ByteArrayInputStream(s.getBytes(Charset.defaultCharset()));
JasperReport jasperReport = null;
jasperReport = JasperCompileManager.compileReport(bais); //CRASH ON FUSE AND EAP. NO CRASH ON SPRINGBOOT
更新2:
我发现了问题。导致崩溃的不是JRRCompileData类(如Log所说),而是对Fuse的某些依赖。特别是“普通摘要”和“ itext”。 无论如何,谢谢您的关注。