JasperReport序列化/反序列化对象

时间:2019-02-27 11:11:57

标签: java spring jboss jasper-reports classnotfoundexception

我对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”。 无论如何,谢谢您的关注。

0 个答案:

没有答案