Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 谁能帮我拿一个';NotesContext未为线程初始化';错误?_Java_Jasper Reports_Xpages - Fatal编程技术网

Java 谁能帮我拿一个';NotesContext未为线程初始化';错误?

Java 谁能帮我拿一个';NotesContext未为线程初始化';错误?,java,jasper-reports,xpages,Java,Jasper Reports,Xpages,请原谅我,如果这个问题以前已经得到了回答,但是我在网上找不到太多关于它的信息 我在Domino中编写了一些Java,将字段值传递给Jasper报告并生成PDF结果。该报告由一个子报告和一个子报告组成。因此,本质上,我得到了主报表的字段值列表,其中一个是子报表的字段值数组。在子报表数组的每个记录中,可能存在子报表的另一个字段值数组。很简单 我所有的Domino数据检索都是在一个bean中完成的,我在那里初始化了NotesContext,所以我不明白为什么仍然会出现这个错误 就像背景一样。。。就在上

请原谅我,如果这个问题以前已经得到了回答,但是我在网上找不到太多关于它的信息

我在Domino中编写了一些Java,将字段值传递给Jasper报告并生成PDF结果。该报告由一个子报告和一个子报告组成。因此,本质上,我得到了主报表的字段值列表,其中一个是子报表的字段值数组。在子报表数组的每个记录中,可能存在子报表的另一个字段值数组。很简单

我所有的Domino数据检索都是在一个bean中完成的,我在那里初始化了NotesContext,所以我不明白为什么仍然会出现这个错误

就像背景一样。。。就在上周,我开始学习如何这样做,并且能够成功地将硬编码数据传递到PDF。这是我第一次尝试从Domino数据库传递值

下面是获取Domino数据的DataBeanList类:

import java.util.*;
import lotus.domino.*;
import com.ibm.domino.xsp.module.nsf.NotesContext;
import com.hsdomino.jasper.SubReportBeanWS;
import com.hsdomino.jasper.SubReportBeanMisc;

public class DataBeanList {
    //this class populates an object array of all the field value objects for the report
    //for subreports, there will be multiple objects in the subreport beans, one for each detail band
   public ArrayList<DataBean> getDataBeanList(String docnum) {

       //create the array to return
       ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();
       //this will be a single record array consisting of a series of fields and array of ws subreport 
       //fields that contains another array of misc subsubreport fields

       try{
           NotesContext ctx = NotesContext.getCurrent();
           Session sess = ctx.getCurrentSession();
           Database db = sess.getCurrentDatabase();

           View baseview = db.getView("QuoteLetterBase_Java");
           View wsview = db.getView("QuoteLetterWS");
           View miscview = db.getView("QuoteLetterMisc");

           //get the base data
           ViewEntry ventry = baseview.getEntryByKey(docnum,true);
           String repquote = ventry.getColumnValues().get(1).toString();
           String custname = ventry.getColumnValues().get(2).toString();
           String custnum = ventry.getColumnValues().get(3).toString();
           String custadd_2 = ventry.getColumnValues().get(4).toString(); 
           String custadd_3 = ventry.getColumnValues().get(5).toString(); 
           String custadd_4 = ventry.getColumnValues().get(6).toString(); 
           String custadd_5 = ventry.getColumnValues().get(7).toString(); 
           String custadd_6 = ventry.getColumnValues().get(8).toString(); 
           String contact = ventry.getColumnValues().get(9).toString(); 
           String contactemail = ventry.getColumnValues().get(10).toString();
           String contactphone = ventry.getColumnValues().get(11).toString();
           String program = ventry.getColumnValues().get(12).toString(); 
           String inqnum = ventry.getColumnValues().get(13).toString(); 
           String fob = ventry.getColumnValues().get(14).toString(); 
           String terms = ventry.getColumnValues().get(15).toString(); 
           String estimator = ventry.getColumnValues().get(16).toString(); 
           String saleseng = ventry.getColumnValues().get(17).toString();
           String expires = ventry.getColumnValues().get(18).toString(); 
           String qnotes = ventry.getColumnValues().get(19).toString(); 
           String bottomterms = ventry.getColumnValues().get(20).toString(); 
           String tmp = ventry.getColumnValues().get(21).toString();
           Double totalquote = Double.parseDouble(tmp); 
           String docnumoption = ventry.getColumnValues().get(22).toString(); 
           String datesentoption = ventry.getColumnValues().get(23).toString();
           String id = ventry.getColumnValues().get(24).toString(); 
           String draft = ventry.getColumnValues().get(25).toString(); 
           String contactscc = ventry.getColumnValues().get(26).toString();

           //get the wsdata as an array
           ViewEntryCollection vecol = wsview.getAllEntriesByKey(docnum,true);
           ArrayList<SubReportBeanWS> wssubRepList = new ArrayList<SubReportBeanWS>();
           if(vecol.getCount()>0){
               ViewEntry wsventry = vecol.getFirstEntry();
               while(wsventry!=null){
                    String line = wsventry.getColumnValues().get(2).toString();
                    String group1 = wsventry.getColumnValues().get(3).toString();
                    String group2 = wsventry.getColumnValues().get(4).toString();
                    String group3 = wsventry.getColumnValues().get(5).toString();
                    String group4 = wsventry.getColumnValues().get(6).toString();
                    String qnotes1 = wsventry.getColumnValues().get(8).toString();
                    String qnotes2 = wsventry.getColumnValues().get(9).toString();
                    String qnotes3 = wsventry.getColumnValues().get(10).toString();
                    String qnotes4 = wsventry.getColumnValues().get(11).toString();
                    String qnotes5 = wsventry.getColumnValues().get(12).toString();
                    String qnotes6 = wsventry.getColumnValues().get(13).toString();
                    String qnotes7 = wsventry.getColumnValues().get(14).toString();
                    String qnotes8 = wsventry.getColumnValues().get(15).toString();
                    String qnotes9 = wsventry.getColumnValues().get(16).toString();
                    String qnotes10 = wsventry.getColumnValues().get(17).toString();
                    String tmpws = wsventry.getColumnValues().get(18).toString();
                    Double totalquotews = Double.parseDouble(tmpws); 
                    String wsdocnum = wsventry.getColumnValues().get(19).toString();

                    //get the misc data list as an array
                    ArrayList<SubReportBeanMisc> miscsubRepList = new ArrayList<SubReportBeanMisc>();
                    ViewEntryCollection miscvecol = miscview.getAllEntriesByKey(wsdocnum,true);
                    if(miscvecol.getCount()>0){
                        ViewEntry miscventry = miscvecol.getFirstEntry();
                        while(miscventry!=null){
                            String miscgroup1 = miscventry.getColumnValues().get(3).toString();
                            String tmpmisc = miscventry.getColumnValues().get(9).toString();
                            Double totalquotemisc = Double.parseDouble(tmpmisc); 

                            //create a misc bean to store in the misc array
                            SubReportBeanMisc miscsubbean = new SubReportBeanMisc();
                            miscsubbean.setGroup1(miscgroup1);
                            miscsubbean.setTotalquote(totalquotemisc);
                            miscsubRepList.add(miscsubbean);

                            ViewEntry tmpmiscve = miscvecol.getNextEntry(miscventry);
                            miscventry.recycle();
                            miscventry = tmpmiscve;
                        }
                    }
                    miscvecol.recycle();

                    //create a ws bean to store in the base array
                    SubReportBeanWS wssubbean = new SubReportBeanWS();
                    wssubbean.setLine(line);
                    wssubbean.setGroup1(group1);
                    wssubbean.setGroup2(group2);
                    wssubbean.setGroup3(group3);
                    wssubbean.setGroup4(group4);
                    wssubbean.setQnotes1(qnotes1);
                    wssubbean.setQnotes2(qnotes2);
                    wssubbean.setQnotes3(qnotes3);
                    wssubbean.setQnotes4(qnotes4);
                    wssubbean.setQnotes5(qnotes5);
                    wssubbean.setQnotes6(qnotes6);
                    wssubbean.setQnotes7(qnotes7);
                    wssubbean.setQnotes8(qnotes8);
                    wssubbean.setQnotes9(qnotes9);
                    wssubbean.setQnotes10(qnotes10);
                    wssubbean.setTotalquote(totalquotews);
                    wssubbean.setWsdocnum(wsdocnum);
                    wssubbean.setSubReportBeanMiscList(miscsubRepList);

                    wssubRepList.add(wssubbean);

                   ViewEntry tmpve = vecol.getNextEntry(wsventry);
                   wsventry.recycle();
                   wsventry = tmpve;
               }

               vecol.recycle();
           }

           //create the base quote bean array
           dataBeanList.add(produce(docnum,repquote,custname,custnum,custadd_2,custadd_3,custadd_4,custadd_5,custadd_6,contact,contactemail,contactphone,
                   program,inqnum,fob,terms,estimator,saleseng,expires,qnotes,bottomterms,totalquote,docnumoption,datesentoption,id,draft,contactscc,wssubRepList));

           ventry.recycle();
           baseview.recycle();
           wsview.recycle();
           miscview.recycle();
       }
       catch(NotesException e){
           System.out.println("Error in DataBeanList: " + e);
       }

       return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with all the fields for the main report in it (and an array for the WS subreport
    * which contains an array for th misc subreport)
    */
   private DataBean produce(String qnum, String repquote, String custname, String custnum, String custadd_2, 
           String custadd_3, String custadd_4, String custadd_5, String custadd_6, String contact, String contactemail,
           String contactphone, String program, String inqnum, String fob, String terms, String estimator, String saleseng,
           String expires, String qnotes, String bottomterms, Double totalquote, String docnumoption, String datesentoption,
           String id, String draft, String contactscc, List<SubReportBeanWS> subBean) {
      DataBean dataBean = new DataBean();
      dataBean.setDocnum(qnum);
      dataBean.setRepquote(repquote);
      dataBean.setCustname(custname);
      dataBean.setCustnum(custnum);
      dataBean.setCustadd_2(custadd_2);
      dataBean.setCustadd_3(custadd_3);
      dataBean.setCustadd_4(custadd_4);
      dataBean.setCustadd_5(custadd_5);
      dataBean.setCustadd_6(custadd_6);
      dataBean.setContact(contact);
      dataBean.setContactemail(contactemail);
      dataBean.setContactphone(contactphone);
      dataBean.setProgram(program);
      dataBean.setInqnum(inqnum);
      dataBean.setFob(fob);
      dataBean.setTerms(terms);
      dataBean.setEstimator(estimator);
      dataBean.setSaleseng(saleseng);
      dataBean.setExpires(expires);
      dataBean.setQnotes(qnotes);
      dataBean.setBottomterms(bottomterms);
      dataBean.setTotalquote(totalquote);
      dataBean.setDocnumoption(docnumoption);
      dataBean.setDatesentoption(datesentoption);
      dataBean.setId(id);
      dataBean.setDraft(draft);
      dataBean.setContactscc(contactscc);
      dataBean.setSubReportBeanWSList(subBean);

      return dataBean;
   }
}
main类运行所有程序以获取数据,但随后在这一行生成错误:

   JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,parameters,beanColDataSource);
我通过在Domino控制台上跟踪它知道这一点:

[17E0:000D-1F9C] 04/20/2017 02:49:51 PM  HTTP JVM: setting reportname
[17E0:000D-1F9C] 04/20/2017 02:49:51 PM  HTTP JVM: setting parameters
[17E0:000D-1F9C] 04/20/2017 02:49:51 PM  HTTP JVM: setting beancol datasrc
[17E0:000D-1F9C] 04/20/2017 02:49:51 PM  HTTP JVM: setting base data
[17E0:000D-1F9C] 04/20/2017 02:49:52 PM  HTTP JVM: setting wsdata for line 1.
[17E0:000D-1F9C] 04/20/2017 02:49:52 PM  HTTP JVM: - - - checking misc data
[17E0:000D-1F9C] 04/20/2017 02:49:52 PM  HTTP JVM: getting misc data for line 1.
[17E0:000D-1F9C] 04/20/2017 02:49:52 PM  HTTP JVM: setting subreportbeanws
[17E0:000D-1F9C] 04/20/2017 02:49:52 PM  HTTP JVM: setting databeanlist
[17E0:000D-1F9C] 04/20/2017 02:49:52 PM  HTTP JVM: calling jasperfillmgr
[17E0:0163-2300] 04/20/2017 02:49:52 PM  HTTP JVM: java.lang.IllegalStateException: NotesContext not initialized for the thread. For more detailed information, please consult error-log-0.xml located in C:/Program Files/IBM/XWork/data/domino/workspace/logs
主要类别:

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class CreatePDF implements Serializable {
    private static final long serialVersionUID = 1L;

    public CreatePDF(){
        //for managed bean
    }

       public void reportToFile(String docnum) {

           try {
System.out.println("setting reportname");
           String jasperReport = "C://Users/RPo/Documents/BobC/Jasper Reports/Studio Reports/MyReports/HSD_Quote_Java.jasper";
           String subReportWS = "C://Users/RPo/Documents/BobC/Jasper Reports/Studio Reports/MyReports/HSD_QuoteWS_Java.jasper";
           String subReportMisc = "C://Users/RPo/Documents/BobC/Jasper Reports/Studio Reports/MyReports/HSD_QuoteMisc_Java.jasper";
           String destReport = "C:/JReports/HSD/"+docnum+".pdf";

System.out.println("setting parameters");
       // Parameters for report
        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("SubReportWS", subReportWS); 
        parameters.put("SubReportMisc", subReportMisc); 

       // DataSource
System.out.println("setting beancol datasrc");              
          DataBeanList DataBeanList = new DataBeanList();
          ArrayList<DataBean> dataList = DataBeanList.getDataBeanList(docnum);
          JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataList);

System.out.println("calling jasperfillmgr");
       JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,parameters,beanColDataSource);

System.out.println("calling exporttopdf");
       // Export to PDF.
        JasperExportManager.exportReportToPdfFile(jasperPrint,destReport);

       System.out.println("Done!");

            } catch (Exception e) {
                System.out.println("Error in CreatePDF: " + e);
                throw new RuntimeException("error in CreatePDF: ", e);
            }
   }
}
此jrxml数据不适用于本文(grrrr)

有人能告诉我解决这个问题的正确方向吗


更新:2017年4月25日,我删除了子报告,它工作得非常好!因此,我将重点放在这一点上。

尝试从XPages(JSF)引擎获取会话,如下所示:

var docnum = rdata.getColumnValue("_DocNum");
var pdf = new com.hsdomino.jasper.CreatePDF;
pdf.reportToFile(docnum)
Session session = DominoUtils.getCurrentSession();

您在哪个Domino版本上运行此功能?这是托管bean还是非托管bean?我使用的是Domino9.0.1,主类是托管bean,这里是:您的模板(jrxml)是错误的,因为您得到了
JRexpressioneException:Error计算源文本的表达式:new java.lang.Integer(1)
Error如何调用它?Stacktrace显示您有一些调用它的SSJS调用。是的,我也看到了整数引用,但我没有在任何地方使用任何整数,所以我不理解它。(我仔细检查了jasper报告和变量声明)。是的,Frantisek,我是这样从ssjs调用我的代码的(参见帖子)。我刚刚尝试添加可序列化的行,但仍然得到相同的错误。谢谢你的建议,但我使用它得到了相同的结果。
Session session = DominoUtils.getCurrentSession();