我有一个JSR 168 portlet应用程序,它最初是为WebSphere Portal 6.0开发的,然后以使其工作所需的最小更改转移到WebSphere Portal 7.0,现在我试图将其转移到WebSphere Portal 8.5。
到目前为止,我只在WP 8.5上测试了其中一个portlet,使用WP 7.0版本的应用程序,没有任何更改。它似乎触发了应用程序的Error.jsp,它自己在服务器日志中产生一个NullPointerException。
该应用程序的项目方面包括"JavaServer Faces 1.1"one_answers"JavaServer Faces (IBM Enhanced) 7.0"。
我正在测试的portlet有一个JSP指定为主页,通过应用程序中"portlet.xml"文件中的portlet
元素中的这个元素:
当我在浏览器中打开包含此portlet的页面时,预期的内容似乎可以正确呈现,但是内容中的链接没有做任何事情。
每次加载页面都会在服务器上的"SystemOut.log"中产生以下堆栈跟踪,我对其进行了一些截断:
[14/08/15 13:52:27:826 EST] 00000158 ServletWrappe E com.ibm.ws.webcontainer.servlet.ServletWrapper服务CWSRV0068E: servlet的一个服务方法抛出了一个异常[/Error.jsp]在应用[PA_TeamElite]。[java.lang.NullPointerException .com.ibm.ws.portletcontainer.tags.DefineObjectsTag.doStartTag (DefineObjectsTag.java: 62)com.ibm._jsp._Error._jspService (_Error.java: 105)com.ibm.ws.jsp.runtime.HttpJspBase.service (HttpJspBase.java: 99)javax.servlet.http.HttpServlet.service (HttpServlet.java: 668)com.ibm.ws.webcontainer.servlet.ServletWrapper.service (ServletWrapper.java: 1230)com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest (ServletWrapper.java: 779)com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest (ServletWrapper.java: 478)com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest (ServletWrapperImpl.java: 178)...之前我假设有其他错误触发了error .jsp,但如果是这样,初始错误不会出现在日志文件或浏览器中。
什么可能导致Error.jsp中的NullPointerException
,我如何修复它?我怀疑这是一个配置问题,但是Error.jsp的完整内容在下面,以防有任何帮助。
在Error.jsp中使用的MHFacesPortlet
是扩展了com.ibm.faces.portlet.FacesPortlet
的自定义类。<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" session="false" isErrorPage="true" import="com.devcompany.util.portlet.MHFacesPortlet"%> <portlet:defineObjects /> <%javax.portlet.PortletURL url = renderResponse.createActionURL(); url.setParameter(MHFacesPortlet.PARAMETER_EXTENDED_ACTION, MHFacesPortlet.ACTION_VIEW_MODE_RESET); %> <p>The following error has occurred. Click <a href="<%= url.toString()%>">here</a> to go to the portlet home page.</p> <%Throwable e = exception; while (e != null) {%> <%=e.getMessage()%> <br> <br> <% e.printStackTrace(); e = e.getCause(); }%>
我已经发现了触发Error.jsp的原因,并得出结论:正如Konstantin在评论中所建议的那样,NullPointerException
是由于Error.jsp没有通过portlet呈现而引起的。
当在WebSphere Portal 8.5中使用应用程序时,这个标记被添加到HTML中:
<script type="text/javascript"
src="/wps/PA_AppName/portlet/javax.faces.resource/oamSubmit.js?ln=org.apache.myfaces">
该标记中的路径产生404错误,该错误触发error .jsp,然后产生NullPointerException
.
404错误也会导致portlet JSP中的链接失败,因为它们依赖于应该在oamSubmit.js中的javascript。
我通过将此添加到web.xml文件来修复这两个问题:
<context-param>
<param-name>org.apache.myfaces.RENDER_FORM_SUBMIT_SCRIPT_INLINE</param-name>
<param-value>true</param-value>
<description></description>
</context-param>