I was getting a JSP compilation problem that I could not solve.
org.apache.jasper.JasperException: Unable to compile class for JSP at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) org.apache.jasper.JasperException: Unable to compile class for JSP at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:572) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303) java.lang.NumberFormatException: For input string: "${status.index}" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:447) at java.lang.Integer.valueOf(Integer.java:553) at org.apache.jasper.compiler.JspUtil.coerceToInt(JspUtil.java:752) at org.apache.jasper.compiler.Generator$GenerateVisitor.convertString(Generator.java:2949)
The major problem was this was happening on the server but not locally. The compilation problem was occurring for this line.
<uportal:module definition="${module}" moduleIndex="${status.index}"/>
The moduleIndex value is “${status.index}”. Locally when the JSP compiler encounters this it knows to call my setter for moduleIndex that takes a String parameter. But on the server the JSP compiler seemed to insist on using the setter for moduleIndex that takes an integer parameter, hence the compilation problem.
I finally posted on the Sun Forums and with the help of evnafets I came up with two solutions.
- The correct solution is to upgrade my application to use JSTL 1.1. Then the JSTL expressions such as “${status.index}” will be evaluated by the container. Then I don’t have to have a setter that takes a String parameter, the JSTL expression, and evaluate it myself. I can just use a setter that takes an integer parameter.
- The quick, hack solution which is to get rid of the setter that takes an integer parameter. Wherever the application passes in an integer parameter, I change it to pass in a String representation of that integer.