以下是我的“Super Visual Formade(简称SVF)FOR Java生成PDF报表” 项目中一段代码,
第一次执行这个servlet时,一切执行都很正常,第二次执行时,因为SvfrClient svfTest;是全局变量,它还可以保存第一次的值的,但是执行到svfTest.VrSetForm时就报这样的错了:
java.lang.IllegalAccessException: Illegal thread access
at jp.co.fit.vfreport.SvfrClient.checkAccess(SvfrClient.java:160)
at jp.co.fit.vfreport.SvfrClient.VrSetForm(SvfrClient.java:494)
at jp.jib.fuyo.servlet.FuyoPrtServletTestSYH.service(FuyoPrtServletTestSYH.java:163)
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 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
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:664)
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)哪位大侠能否能我一点提示,到底是什么原因啊?我需要svfTest对象第一次执行后的数据的啊。能否给点解决的建议呢。
private boolean bFlag = false; private SvfrClient svfTest; /**
 * 電文の送受信を行う(サーブレットのmainメソッド)
 * 
 * @param req
 *            HTTPリクエスト
 * @param res
 *            HTTPレスポンス
 * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest,
 *      javax.servlet.http.HttpServletResponse)
 */
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException { int retTest; try { if (bFlag == false) {
// Vrw32 svfTest = new Vrw32();
svfTest = new SvfrClient("127.0.0.1"); retTest = svfTest.VrInit();
if (retTest < 0) {
System.out.println("error: VrInit() = " + retTest);
return;
}
retTest = svfTest.VrSetPrinter("", "PDF");
if (retTest < 0) {
System.out.println("error: VrSetPrinter() = " + retTest);
return;
}
retTest = svfTest
.VrSetSpoolFileName2("C:\\syh\\ROOT\\pdfTest\\sample.pdf");
if (retTest < 0) {
System.out.println("error: VrSetSpoolFileName2() = "
+ retTest);
return;
} retTest = svfTest.VrSetForm(
"C:\\syh\\ROOT\\pdfTest\\FRECY01.frm", 5); // ←2
// つめの様式ファイルをレポートライターモードで指定
if (retTest < 0) {
System.out.println("error: VrSetForm() = " + retTest);
return;
}
retTest = svfTest.VrsOut("KYKNM",
"svfTest for Web / PDF JavaEdition");
if (retTest < 0) {
System.out.println("error: VrsOut() = " + retTest);
return;
} retTest = svfTest.VrEndRecord();
if (retTest < 0) {
System.out.println("error: VrEndRecord() = " + retTest);
return;
}
retTest = svfTest.VrPrint(); // ← *2
if (retTest < 0) {
System.out.println("error: VrPrint() = " + retTest);
return;
} } if (bFlag) {
retTest = svfTest.VrSetForm(
"C:\\syh\\ROOT\\pdfTest\\ZNKLIST.frm", 5); // ←3
// つめの様式ファイルをランダムモードで指定
if (retTest < 0) {
System.out.println("error: VrSetForm() = " + retTest);
return;
}
retTest = svfTest.VrsOut("KYKNM", "data-end");
if (retTest < 0) {
System.out.println("error: VrsOut() = " + retTest);
return;
}
// svfTest.VrEndPage(); //← *1
retTest = svfTest.VrEndRecord();
if (retTest < 0) {
System.out.println("error: VrEndRecord() = " + retTest);
return;
}
retTest = svfTest.VrPrint(); // ← *2
if (retTest < 0) {
System.out.println("error: VrPrint() = " + retTest);
return;
} retTest = svfTest.VrQuit();
if (retTest < 0) {
System.out.println("error: VrQuit() = " + retTest);
return;
}
} } catch (Exception e) {
e.printStackTrace();
}
bFlag = !bFlag;
}

解决方案 »

  1.   

    以上代码,去掉bFlag的判断,一次性执行是完全没有错误的。
    为了测试,所以让它分二次执行,所以加了bFlag的判断。关于servlet的类成员svfTest,第二次执行时,值还是有的,但是就是执行报如上的错
    复制到JAVA编辑后,能帮我分析一下行吗?
      

  2.   

    呵呵,我以前做日本外包的时候就是专门研究Super Visual Formade
    输出pdf文件的
    没想到这么偏的一个软件还有人用~~~~~`
      

  3.   

    现在PDF格式非常流行,连复制机也可以输出生成PDF文件,好多网站对外文档都是PDF格式的。还我觉得还行吧,你们知道还有什么帐票工具可以生成PDF格式的啊?