I have a application where the frontend is based on the Spring Roo 1.1.2 jspx files.
Every think works fine in Tomcat 6, but if I deploy the same application in a Websphere 7 (class loader: parent last), then I get a exception:
java.lang.ClassCastException: java.lang.NullPointerException incompatible with javax.el.ELException
[13.04.11 09:53:55:493 UTC] 00000026 servlet E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E: Uncaught exception created in one of the service methods of the servlet /WEB-INF/layouts/default.jspx in application cyber. Exception created : com.ibm.websphere.servlet.error.ServletErrorReport: java.lang.ClassCastException: java.lang.NullPointerException incompatible with javax.el.ELException
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:693)
at com.ibm._jsp._default_5F_jspx._jspService(_default_5F_jspx.java:123)
at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1655)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1595)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:104)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:895)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:932)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:500)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:121)
at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:239)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:341)
at org.apache.tiles.servlet.context.ServletTilesRequestContext.forward(ServletTilesRequestContext.java:241)
...
Caused by: java.lang.ClassCastException: java.lang.NullPointerException incompatible with javax.el.ELException
at org.apache.el.lang.ExpressionBuilder.prepare(ExpressionBuilder.java:139)
at org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:151)
at org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:194)
at org.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:67)
at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:773)
at com.ibm.ws.jsp.tagfile.webinf.util._load_2D_scripts.doTag(_load_2D_scripts.java:74)
at com.ibm._jsp._default_5F_jspx._jspx_meth_util_load$1scripts_0(_default_5F_jspx.java:140)
at com.ibm._jsp._default_5F_jspx._jspService(_default_5F_jspx.java:94)
... 88 more
The application has a Flex/BlazeDS part, that works fine. But there is also this JSP(x) part. The Spring controllers work, but there is something wrong with the JSPXs, and I have no idea where to start, when I understand the specification right, than WAS7 provides JSP 2.1, that is exactly what I need.
The relevant part of the POM for the WAR is:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>com.springsource.javax.servlet.jsp.jstl</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
Can anybody give me a hint?
This this the maven dependency tree:
[INFO] +- cyber:cyber-core:jar:4.0.0.0-D1-SNAPSHOT:compile
[INFO] | +- javax.validation:com.springsource.javax.validation:jar:1.0.0.GA:compile
[INFO] | +- javax.transaction:com.springsource.javax.transaction:jar:1.1.0:compile
[INFO] | +- org.apache.poi:poi:jar:3.6:compile
[INFO] | +- net.sf.jxls:jxls-core:jar:0.9.9:compile
[INFO] | | +- commons-beanutils:commons-beanutils:jar:1.8.2:compile
[INFO] | | \- commons-jexl:commons-jexl:jar:1.1:compile
[INFO] | | \- junit:junit:jar:3.8.1:compile
[INFO] | +- net.sf.jxls:jxls-reader:jar:0.9.9:compile
[INFO] | +- org.apache.commons:com.springsource.org.apache.commons.dbcp:jar:1.2.2.osgi:compile
[INFO] | | \- org.apache.commons:com.springsource.org.apache.commons.pool:jar:1.3.0:compile
[INFO] | +- commons-io:commons-io:jar:1.4:compile
[INFO] | +- org.apache.commons:com.springsource.org.apache.commons.collections:jar:3.2.1:compile
[INFO] | +- commons-lang:commons-lang:jar:2.4:compile
[INFO] | +- commons-math:commons-math:jar:1.2:compile
[INFO] | +- jdom:jdom:jar:1.0:compile
[INFO] +- org.springframework:org.springframework.core:jar:3.0.5.RELEASE:compile
[INFO] +- org.springframework:org.springframework.beans:jar:3.0.5.RELEASE:compile
[INFO] | \- org.springframework:org.springframework.asm:jar:3.0.5.RELEASE:compile
[INFO] +- org.springframework:org.springframework.context:jar:3.0.5.RELEASE:compile
[INFO] | \- org.springframework:org.springframework.expression:jar:3.0.5.RELEASE:compile
[INFO] +- org.springframework:org.springframework.web:jar:3.0.5.RELEASE:compile
[INFO] | \- org.aopalliance:com.springsource.org.aopalliance:jar:1.0.0:compile
[INFO] +- org.springframework:org.springframework.web.servlet:jar:3.0.5.RELEASE:compile
[INFO] +- org.springframework:org.springframework.aop:jar:3.0.5.RELEASE:compile
[INFO] +- org.springframework:org.springframework.aspects:jar:3.0.5.RELEASE:compile
[INFO] +- org.springframework:org.springframework.orm:jar:3.0.5.RELEASE:compile
[INFO] | +- org.springframework:org.springframework.jdbc:jar:3.0.5.RELEASE:compile
[INFO] | \- org.springframework:org.springframework.transaction:jar:3.0.5.RELEASE:compile
[INFO] +- org.springframework:org.springframework.context.support:jar:3.0.5.RELEASE:compile
[INFO] +- org.springframework:spring-webmvc:jar:3.0.5.RELEASE:compile
[INFO] | +- org.springframework:spring-asm:jar:3.0.5.RELEASE:compile
[INFO] | +- org.springframework:spring-beans:jar:3.0.5.RELEASE:compile
[INFO] | +- org.springframework:spring-context:jar:3.0.5.RELEASE:compile
[INFO] | | \- org.springframework:spring-aop:jar:3.0.5.RELEASE:compile
[INFO] | +- org.springframework:spring-context-support:jar:3.0.5.RELEASE:compile
[INFO] | +- org.springframework:spring-core:jar:3.0.5.RELEASE:compile
[INFO] | +- org.springframework:spring-expression:jar:3.0.5.RELEASE:compile
[INFO] | \- org.springframework:spring-web:jar:3.0.5.RELEASE:compile
[INFO] | \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework.webflow:spring-js-resources:jar:2.2.1.RELEASE:compile
[INFO] +- org.springframework.security:org.springframework.security.core:jar:3.0.3.RELEASE:compile
[INFO] | \- org.apache.commons:com.springsource.org.apache.commons.logging:jar:1.1.1:compile
[INFO] +- org.springframework.security:org.springframework.security.web:jar:3.0.3.RELEASE:compile
[INFO] +- org.springframework.security:org.springframework.security.config:jar:3.0.3.RELEASE:compile
[INFO] +- org.apache.tiles:tiles-core:jar:2.2.1:compile
[INFO] | +- org.apache.tiles:tiles-api:jar:2.2.1:compile
[INFO] | +- commons-digester:commons-digester:jar:2.0:compile
[INFO] | \- org.slf4j:jcl-over-slf4j:jar:1.5.10:compile
[INFO] +- org.apache.tiles:tiles-jsp:jar:2.2.1:compile
[INFO] | +- org.apache.tiles:tiles-servlet:jar:2.2.1:compile
[INFO] | \- org.apache.tiles:tiles-template:jar:2.2.1:compile
[INFO] +- org.tuckey:urlrewritefilter:jar:3.1.0:compile
[INFO] +- org.springframework:spring-oxm:jar:3.0.5.RELEASE:compile
[INFO] +- javax.servlet:com.springsource.javax.servlet.jsp.jstl:jar:1.2.0:compile
[INFO] | \- org.apache.taglibs:com.springsource.org.apache.taglibs.standard:jar:1.1.2:compile
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided
[INFO] +- javax.servlet.jsp:jsp-api:jar:2.1:provided
[INFO] +- org.aspectj:aspectjweaver:jar:1.6.9:compile
[INFO] +- org.aspectj:aspectjrt:jar:1.6.9:compile
The 4 steps to make a Roo generated JSPX running on Websphere 7
or how I spend my last two days
The problem is that the Roo (1.1.2) generated JSPX files are not compatible with IBM Webshpere. So it is not a problem of the libaries.
To get the Roo templates running you need to do this:
The first problem (that causes the
java.lang.ClassCastException: java.lang.NullPointerException incompatible with javax.el.ELExceptionException is this line<util:load-scripts />in WEB-INF/layout/default.jspx I have absolute no idea why, because all other tagx work (I spend my whole evening). The easiest work arround is to “include” the relevant content of /WEB-INF/tags/util/load-scripts.tagx direct by hand in default.jspx. (Then you can delete the load-scripts.tagx)A new Validation error will occure: this is because IBM seams to have problems to parse jstl functions in
'. For example:${fn:toLowerCase(userLocale)}. And this is exacly one of the lines copied fromload-scripts.tagxtodefault.jspxin step 1. My workarround is: to replace:by:
Now you will see something, but I you look at the output, you will see, hat IBM Websphere 7 does not remove the namespace definitions form divs. But in the template you will have a lot of this
<div xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:spring="http://www.springframework.org/tags" version="2.0">So what you need to do is extract all of them in to<jsp:rootelements (In all jspx files). So that the files looks like that:I am not 100% sure if this step is need, but you need the next one.
Now everything works, except the Java Scripts. That is because IBM Websphere 7, Normalize the JSPX output. So that lines like that:
become
<script src="${spring_dojo_url}" type="text/javascript" />unfortunately IE and Firefox (3) ignore this script tags. The workaround is to put a<jsp:text> </jsp:text>in to the script part of all (3) relevant script tags, copied in step 1.At least your default.jspx look like this: