spring,hibernate,struts实现了WEB程序基本功能,程序中需要生成报表我用的JasperReport我用 iReport-2.0.5 通过MYSQL生成了news.jasper用iReport-2.0.5可以生成各种报表了但是我用JAVA怎么调用生成呀JAVAWEB程序我想在页面上按以下按钮就生成报表文件,求求你帮帮我看看我哪错了非常非常急~~我哪写错了news.jasper 已经生成完事用的MYSQL的JDBC连的数据库
设置断点查询到这地方异常JasperPrint jasperprint=JasperFillManager.fillReport(reportFile.getPath(),map,conn);try {
Class.forName("com.mysql.jdbc.Driver");
try {
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/news","root","");
ServletContext servletcontext=this.getServletContext();
System.out.println(servletcontext.getRealPath("jasper/news.jasper"));
File reportFile=new File(servletcontext.getRealPath("jasper/news.jasper"));

try {
Map map=new HashMap();
//JasperRunManager.runReportToPdf(reportFile.getPath(),map,conn);
JasperPrint jasperprint=JasperFillManager.fillReport(reportFile.getPath(),map,conn);
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaa");
ByteArrayOutputStream baos=new ByteArrayOutputStream();
JRExporter exporter=new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperprint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
exporter.exportReport();

byte[] bytes=baos.toByteArray();
if(bytes!=null && bytes.length > 0){
response.reset();
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream outputStream=response.getOutputStream();
outputStream.write(bytes,0,bytes.length);
outputStream.flush();
outputStream.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
异常是:
java.lang.ClassCastException: cannot assign instance of net.sf.jasperreports.engine.base.JRBaseTextField to field net.sf.jasperreports.engine.base.JRBaseLineBox.boxContainer of type net.sf.jasperreports.engine.JRBoxContainer in instance of net.sf.jasperreports.engine.base.JRBaseLineBox
at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:1977)
at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1157)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1918)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at java.util.ArrayList.readObject(ArrayList.java:592)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:919)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1813)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:88)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:232)
at com.txc.servlet.jasper.doGet(jasper.java:71)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.txc.filter.SetEncodingFilter.doFilter(SetEncodingFilter.java:54)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:667)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

解决方案 »

  1.   

    1、对导出器的声明有问题;2、在B/S下的导出要分缓存的两种情况来判断,给你一个我写的导出例子,肯定没有问题的:
       /**
         * 导出pdf文档
         * @param mapping
         * @param form
         * @param request
         * @param response
         * @throws java.lang.Exception
         * @return
         */
        public ActionForward exportPdf(ActionMapping mapping,
                ActionForm form, HttpServletRequest request,
                HttpServletResponse response) throws Exception {        JasperPrint jasperPrint = (JasperPrint) request.getSession().getAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE);
            //*******************************************************************************
            Boolean isBuffered = Boolean.valueOf(request.getParameter(BaseHttpServlet.BUFFERED_OUTPUT_REQUEST_PARAMETER));
            if (isBuffered.booleanValue()) {
                JRPdfExporter exporter = new JRPdfExporter();
                //exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);            ByteArrayOutputStream baos = new ByteArrayOutputStream();
                exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);            try {
                    exporter.exportReport();
                } catch (JRException e) {
                    return mapping.findForward("failure");
                //throw new ServletException(e);
                }            byte[] bytes = baos.toByteArray();            if (bytes != null && bytes.length > 0) {
                    response.setContentType("application/pdf");
                    //注:如果不要下面一行的话,pdf文档将被直接在浏览器中打印
                    response.setHeader("Content-Disposition", "inline; filename=\"file.pdf\"");
                    response.setContentLength(bytes.length);
                    ServletOutputStream ouputStream = response.getOutputStream();                try {
                        ouputStream.write(bytes, 0, bytes.length);
                        ouputStream.flush();
                    } finally {
                        if (ouputStream != null) {
                            try {
                                ouputStream.close();
                            } catch (IOException ex) {
                            }
                        }
                    }
                }        } else {
                response.setContentType("application/pdf");
                response.setHeader("Content-Disposition", "inline; filename=\"file.pdf\"");
                JRPdfExporter exporter = new JRPdfExporter();
                //exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
                exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
                OutputStream ouputStream = response.getOutputStream();
                exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);            try {
                    exporter.exportReport();
                } catch (JRException e) {
                    return mapping.findForward("failure");
                } finally {
                    if (ouputStream != null) {
                        try {
                            ouputStream.close();
                        } catch (IOException ex) {
                        }
                    }
                }
            }
            //******************************************************************************************
            return null;
        }
      

  2.   

    终于知道原因了 
    原来spring自带了一个低版本的jasperreport, 
    系统运行时使用了它自带的 
    造成版本不一致 
    真是该死.