Hello,
Have an issue on Tomcat 7.0.55 on Windows XP, where Tomcat refuses to
compile a JSP if a primitive variable of type "long" or "double" references
a session attribute, but the variable is never used. Below are three
scenarios for type "long". The issue can be regenerated on a fresh extract
of Tomcat 7.0.55 archive.
Tomcat version: 7.0.55
Java version: jdk1.7.0_67
OS: WinXP
Note-1: The issue applies for "long" and "double"; but NOT for "int" and
"float".
Note-2: The issue does not persist if the variables, though primitive and
never used, are assigned to literals, as in (long v1 = 1L;)
First Scenario (works):
- Both variables are of "primitive" type long
- Both variables are used
- Tomcat generates both JAVA and CLASS files of JSP
- No exceptions are raised on requests.
session.setAttribute("v1", 1L);
session.setAttribute("v2", 2L);
long v1 = (Long) session.getAttribute("v1");
long v2 = (Long) session.getAttribute("v2"); //<-- Primitive
out.write(String.valueOf(v1));
out.write(String.valueOf(v2));
Second Scenario (does not work):
- Both variables are of "primitive" type long
- One variable is used, "the other is not used"
- Tomcat generates JAVA file, "but not the CLASS file"
- An exception is raised (see at the end)
session.setAttribute("v1", 1L);
session.setAttribute("v2", 2L);
long v1 = (Long) session.getAttribute("v1");
long v2 = (Long) session.getAttribute("v2"); //<-- Primitive
out.write(String.valueOf(v1));
*//*out.write(String.valueOf(v2)); //<-- commented
Third Scenario (works):
- Both variables are of type long, "using Wrapper class"
- Don't care if any of the variables is used or not
- Tomcat generates both JAVA and CLASS files of JSP
- No exceptions are raised
session.setAttribute("v1", 1L);
session.setAttribute("v2", 2L);
Long v1 = (Long) session.getAttribute("v1");
Long v2 = (Long) session.getAttribute("v2"); //<-- Wrapper
out.write(String.valueOf(v1));
//out.write(String.valueOf(v2)); //<-- commented
To try the above tests, just extract tomcat's archive (*as-is*) and add a
simple webapp with one JSP file containing one of the scenarios listed
below, and try to access the JSP page.
As for the raised exception:
Oct 21, 2014 4:57:48 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [/test]
threw exception [org.apache.jasper.JasperException: Unable to compile class
for JSP] with root cause
java.lang.ArrayIndexOutOfBoundsException: -1
at
org.eclipse.jdt.internal.compiler.codegen.StackMapFrame.addStackItem(StackMapFrame.java:92)
at org.eclipse.jdt.internal.compiler.ClassFile.traverse(ClassFile.java:5544)
at
org.eclipse.jdt.internal.compiler.ClassFile.generateStackMapTableAttribute(ClassFile.java:4303)
at
org.eclipse.jdt.internal.compiler.ClassFile.completeCodeAttribute(ClassFile.java:1378)
at
org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.generateCode(AbstractMethodDeclaration.java:338)
at
org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.generateCode(AbstractMethodDeclaration.java:270)
at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.generateCode(TypeDeclaration.java:566)
at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.generateCode(TypeDeclaration.java:635)
at
org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.generateCode(CompilationUnitDeclaration.java:368)
at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:781)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:470)
at
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:466)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
at
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:657)
at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2440)
at
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2429)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Best Regards,
Nasry Al-Haddad