websphere 7 (and Spring Roo) incompatible with javax.el.ELException
Asked Answered
G

3

5

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
Guarantor answered 13/4, 2011 at 12:12 Comment(4)
Maybe the output of mvn dependency:tree will make things clearer. The EL jars may be the problem.Courante
@Marcelo Morales: do you mean, I should post it, or is it a hint for me to start searching?Guarantor
Both I guess. A full fledged application server like websphere has a ton of software bundled in. I think newer JSPs depend on EL, so there may be a <scope>provided</scope> missing in your POM.Courante
@Marcelo Morales: I have posted the tree, but I did not find something strange there.Guarantor
G
11

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.ELException Exception 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 from load-scripts.tagx to default.jspx in step 1. My workarround is: to replace:

    <script type="text/javascript">var djConfig = {parseOnLoad: false, isDebug: false, locale: '${fn:toLowerCase(userLocale)}'};</script>
    

by:

   <c:set var="userLocalLowerCase" value="${fn:toLowerCase(userLocale)}" /> 
   <script type="text/javascript">var djConfig = {parseOnLoad: false, isDebug: false, locale: '${userLocalLowerCase}'};</script>
  • 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:root elements (In all jspx files). So that the files looks like that:

    <jsp:root xmlns:c="http://java.sun.com/jsp/jstl/core" ... version="2.0">
    <div>
        ...
    </div>
    </jsp:root>
    

    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:

    <script src="${spring_dojo_url}" type="text/javascript"><!-- required for FF3 and Opera --></script>
    

    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.

    <script src="${dojo_url}" type="text/javascript"><!-- required for FF3 and Opera --><jsp:text> </jsp:text></script>
    <script src="${spring_url}" type="text/javascript"><!-- /required for FF3 and Opera --><jsp:text> </jsp:text></script>
    <script src="${spring_dojo_url}" type="text/javascript"><!-- required for FF3 and Opera --><jsp:text> </jsp:text></script>
    

At least your default.jspx look like this:

<jsp:root 
        xmlns:jsp="http://java.sun.com/JSP/Page"
        xmlns:fn="http://java.sun.com/jsp/jstl/functions"
        xmlns:c="http://java.sun.com/jsp/jstl/core"
        xmlns:tiles="http://tiles.apache.org/tags-tiles"
        xmlns:spring="http://www.springframework.org/tags"
        xmlns:util="urn:jsptagdir:/WEB-INF/tags/util"
        version="2.0">
<html>  

    <jsp:output doctype-root-element="HTML" doctype-system="-//W3C//DTD HTML 4.01//EN" doctype-public="http://www.w3.org/TR/html4/strict.dtd"/>

    <jsp:directive.page contentType="text/html;charset=UTF-8" />  
    <jsp:directive.page pageEncoding="UTF-8" /> 

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=8" />

        <spring:url value="/resources/styles/standard.css" var="roo_css_url" />
        <spring:url value="/resources/dojo/dojo.js" var="dojo_url" />
        <spring:url value="/resources/dijit/themes/tundra/tundra.css" var="tundra_url" />
        <spring:url value="/resources/spring/Spring.js" var="spring_url" />
        <spring:url value="/resources/spring/Spring-Dojo.js" var="spring_dojo_url" />
        <spring:url value="/resources/images/favicon.ico" var="favicon" />
        <link rel="stylesheet" type="text/css" media="screen" href="${roo_css_url}"><!-- required for FF3 and Opera --></link>
        <link rel="stylesheet" type="text/css" href="${tundra_url}"><!-- required for FF3 and Opera --></link>
        <link rel="SHORTCUT ICON" href="${favicon}" />

        <!-- Get the user local from the page context (it was set by Spring MVC's locale resolver) -->
        <c:set var="userLocale">
          <c:out value="${pageContext.response.locale}" default="en" />
        </c:set>

        <c:set var="userLocalLowerCase" value="${fn:toLowerCase(userLocale)}" /> 
        <script type="text/javascript">var djConfig = {parseOnLoad: false, isDebug: false, locale: '${userLocalLowerCase}'};</script>
        <script src="${dojo_url}" type="text/javascript"><!-- required for FF3 and Opera --><jsp:text> </jsp:text></script>
        <script src="${spring_url}" type="text/javascript"><!-- /required for FF3 and Opera --><jsp:text> </jsp:text></script>
        <script src="${spring_dojo_url}" type="text/javascript"><!-- required for FF3 and Opera --><jsp:text> </jsp:text></script>
        <script language="JavaScript" type="text/javascript">dojo.require("dojo.parser");</script>        

        <spring:message code="application_name" var="app_name"/>
        <title><spring:message code="welcome_h3" arguments="${app_name}" /></title>
    </head>

    <body class="tundra spring">
        <div id="wrapper">
            <tiles:insertAttribute name="header" ignore="true" />
            <tiles:insertAttribute name="menu" ignore="true" />   
            <div id="main">
                <tiles:insertAttribute name="body"/> 
                <tiles:insertAttribute name="footer" ignore="true"/>
            </div>
        </div>
    </body>
</html>
</jsp:root>
Guarantor answered 14/4, 2011 at 17:57 Comment(1)
I was having the same problem with WebSphere not finding JSTL functions in an EL surrounded by single quotes and this solution worked. Thanks!Fed
A
1

Also you need to use js comments // to make sure panels work with Websphere7 properly, otherwise you won't be seeing folding panels.

Convert below file last lines like below: (You may need to edit the jsp files using this fiel as well to avoid the execution of cached/compiled version)

load-scripts.tagx




  <script src="${dojo_url}" type="text/javascript">//<!-- required for FF3 and Opera --></script>
  <script src="${spring_url}" type="text/javascript">//<!-- /required for FF3 and Opera --></script>
  <script src="${spring_dojo_url}" type="text/javascript">//<!-- required for FF3 and Opera --></script>
  <script language="JavaScript" type="text/javascript">dojo.require("dojo.parser");</script>

Also Websphere 7 does not have built in support for png files and they won't be rendered unless you convert them to jpg and edit the tags to use jpg instead of png files, or you may install the addon for png support to Websphere 7

EDIT: Adding below to web.xml may solve the problem as well

<mime-mapping>
  <extension>png</extension>
  <mime-type>image/png</mime-type> 
</mime-mapping>
Alembic answered 3/1, 2012 at 16:22 Comment(2)
I would guess that you only need to add the mime type definition for png´s to the web.xml -- anyway some action is needed to address this problem -> +1Guarantor
well adding the mime type did not solve the problem for me but maybe i did it wrong.Alembic
N
1

png files are not supported by default in WebSphere 7; this links shows that you just have to add a new MIME type and it worked for me. http://pic.dhe.ibm.com/infocenter/mpadoc/v7r0m0/index.jsp?topic=%2Fcom.ibm.websphere.wemp.doc%2Fconfiguring%2Fconfiguringwastoacceptmimetypes.html

You can configure WebSphere Application Server to support the PNG MIME type.

If you are using WebSphere Application Server, perform the following steps to configure WebSphere Application Server to support the PNG MIME type.

Procedure

1.Log in to the WebSphere® Application Server Integrated Solutions Console.

2.Expand Environments > Virtual Hosts.

3.Click default_host.

4.Click Additional Properties > MIME Types.

5.Click New.

6.Enter image/png as the value for the MIME Type field.

7.Enter png as the value for the Extension field.

8.Click OK to save the new MIME type.

9.Save the configuration changes.

Naples answered 20/5, 2013 at 15:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.