调用Faces Servlet根URL会抛出Nullpointer

时间:2017-07-12 13:33:13

标签: jsf servlets websphere myfaces

我的web项目的.war文件有上下文根myapp/something,它在EAR文件的application.xml中定义。

在这个项目中,我有一些可以正常工作的Servlet。但是现在我使用模式web.xml/Monitoring/mySite添加了一个Server Faces Servlet。

现在的问题是,如果我调用URL http://somehost/myapp/something/Monitoring/mySite,我最终会进入NullPointer循环,因为没有可用的视图(已知的Websphere问题,fix for that here)。 我想通过将web/page.xhtml设置为welcome-file中的web.xml,这应该是固定的,但它只适用于应用程序的上下文根,即/myapp/something

那么如果我进行以下调用是有效的: http://somehost/myapp/something/Monitoring/mySite/web/page.xhtml http://somehost/myapp/something

TL; DR

但是,当我致电page.xhtml时,我希望看到http://somehost/myapp/something/Monitoring/mySite

我该如何做到这一点?

/ TL; DR

以下是项目的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="myProject" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>This is mySite</display-name>

<!-- Change to "Production" when you are ready to deploy -->
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Production</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

<servlet>
    <description></description>
    <display-name>Monitoring</display-name>
    <servlet-name>Monitoring</servlet-name>
    <servlet-class>some.path.to.Monitoring</servlet-class>
</servlet>
<servlet>
    <description></description>
    <display-name>MonitoringExtended</display-name>
    <servlet-name>MonitoringExtended</servlet-name>
    <servlet-class>some.path.to.MonitoringExtended</servlet-class>
</servlet>
<servlet>
    <description>
    </description>
    <display-name>FacesServlet</display-name>
    <servlet-name>FacesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Monitoring</servlet-name>
    <url-pattern>/Monitoring</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>MonitoringExtended</servlet-name>
    <url-pattern>/Monitoring/extended</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>/Monitoring/mysite/*</url-pattern>
</servlet-mapping>
    <servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>web/page.xhtml</welcome-file>
    <welcome-file>faces/web/page.xhtml</welcome-file>
</welcome-file-list>

这是application.xml的一部分:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5">

<display-name>myApplication</display-name>  

<module>
    <ejb>myApplication.jar</ejb>
</module>
<module>
    <web>
        <web-uri>myProject.war</web-uri>
        <context-root>myapp/something</context-root>
    </web>
</module>
</application>

此处ibm-web-ext.xml(遗产,未触及):

<?xml version="1.0" encoding="UTF-8"?>
<webappext:WebAppExtension xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:webappext="webappext.xmi"
xmi:id="WebAppExtension_1229358884593" reloadInterval="3"
reloadingEnabled="true" additionalClassPath="" fileServingEnabled="true"
directoryBrowsingEnabled="false" serveServletsByClassnameEnabled="true">
    <webApp href="WEB-INF/web.xml#WebApp_ID" />
</webappext:WebAppExtension>

最后ibm-web-bnd.xml(也是遗产,没有碰到它):

<?xml version="1.0" encoding="UTF-8"?>
<webappbnd:WebAppBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:webappbnd="webappbnd.xmi" xmi:id="WebAppBinding_123456789" virtualHostName="default_host">
     <webapp href="WEB-INF/web.xml#WebApp_ID"/>
</webappbnd:WebAppBinding>

1 个答案:

答案 0 :(得分:0)

我通过解决方法解决了这个问题。

我所做的是我的page.xhtml的网址格式,但已重命名,因此符合我的需求,如下所示:

<servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>/Monitoring/mySite.xhtml</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

有了这个,我需要在 WebContent 文件夹中添加一个新文件夹监控(对于其他项目,我猜它是 webapp 文件夹)。在那里,我会放置mySite.xhtml

现在我可以致电http://somehost/myapp/something/Monitoring/mySite.xhtml。 不是我希望的解决方案(我想消除.xhtml),但它确实有用。

有了这个,我也不会遇到Nullpointer循环错误,因为没有可以创建它的URL模式。