代码之家  ›  专栏  ›  技术社区  ›  Bruno Araujo

Struts2和WebSphere Application Server 8(WAS 8)上的自定义错误页

  •  2
  • Bruno Araujo  · 技术社区  · 12 年前

    我们正在将服务器从WAS 7迁移到WAS 8,并面临WAS 7中没有出现的问题:如果请求了无效的URL,WAS 7将使用我们在中设置的自定义错误页进行响应 web.xml ,它是一个JSP并使用Struts标签。然而,在WAS8中,它没有,并在下面显示了错误页面/堆栈跟踪。只有当无效的URL没有默认的struts扩展时才会发生这种情况,所以我认为问题就在 网页.xml 配置,其片段显示在错误页面之后。



    错误页面/堆栈跟踪

    Error Page Exception
    SRVE0260E: The server cannot use the error page specified for your application to handle the Original Exception printed below.
    
    Original Exception:
    Error Message: javax.servlet.ServletException: java.io.FileNotFoundException: SRVE0190E: File not found: /whatever
    Error Code: 404
    Target Servlet: com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor
    Error Stack:
    java.io.FileNotFoundException: SRVE0190E: File not found: /whatever
         at com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor._processEDR(DefaultExtensionProcessor.java:874)
         at com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor.processEDR(DefaultExtensionProcessor.java:855)
         at com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor.handleRequest(DefaultExtensionProcessor.java:433)
         at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:125)
         at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:92)
         at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:389)
         at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:192)
         at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:89)
         at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:919)
         at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1016)
         at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3703)
         at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
         at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:953)
         at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1655)
         at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
         at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
         at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
         at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
         at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:276)
         at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
         at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
         at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
         at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
         at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
         at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
         at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
         at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
         at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
         at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1650)
    
    
    
    Error Page Exception:
    Error Message: The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag. - [unknown location]
    Error Code: 0
    Target Servlet:
    Error Stack:
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag. - [unknown location]
         at org.apache.struts2.views.jsp.TagUtils.getStack(TagUtils.java:60)
         at org.apache.struts2.views.jsp.StrutsBodyTagSupport.getStack(StrutsBodyTagSupport.java:44)
         at org.apache.struts2.views.jsp.ComponentTagSupport.doStartTag(ComponentTagSupport.java:48)
         at com.ibm._jsp._error404._jspx_meth_s_i18n_0(_error404.java:374)
         at com.ibm._jsp._error404._jspService(_error404.java:108)
         at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:99)
         at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
         at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1152)
         at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:722)
         at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:449)
         at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
         at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:122)
         at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:205)
         at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:125)
         at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:77)
         at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:919)
         at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1016)
         at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:1384)
         at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:193)
         at com.ibm.ws.webcontainer.webapp.WebApp.sendError(WebApp.java:3206)
         at com.ibm.ws.webcontainer.webapp.WebApp.handleException(WebApp.java:3733)
         at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3714)
         at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
         at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:953)
         at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1655)
         at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
         at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
         at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
         at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
         at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:276)
         at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
         at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
         at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
         at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
         at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
         at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
         at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
         at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
         at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
         at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1650)
    

    WEB.XML片段

    <filter>
        <filter-name>struts-cleanup</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
    </filter>
    
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <error-page>
        <error-code>404</error-code>
        <location>/error/error404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error/error500.jsp</location>
    </error-page>
    

    由于它在WAS 7上运行良好,我想知道我缺少了什么?是否需要进行任何配置更改以使struts处理WAS8上的自定义错误页面?请注意,我们仍然使用相同的配置文件,并且仍然指向2.4 servlet,如以下片段所示:

    <web-app id="WebApp_ID" 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">
    
    2 回复  |  直到 9 年前
        1
  •  2
  •   Bruno Araujo    12 年前

    联系产品支持后,解决方案是向web.xml添加一个额外的映射,以使ERROR调度器也映射到Struts过滤器,如下所示:

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/error/*</url-pattern>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    

    似乎,在没有特定调度器的映射的情况下,WAS 7使用默认值,而WAS 8不将请求传递给任何过滤器(因为没有映射)。

        2
  •  1
  •   Sam    12 年前

    在从WAS6.1迁移到WAS8.5的过程中,我遇到了同样的问题,因为自定义错误页面包含Struts2标记。

    因为您使用了Struts2标记,所以您必须在struts.xml中定义JSP。

    web.xml文件:

    <error-page>
        <error-code>403/error-code>
        <location>/error403.html</location>  
    </error-page>
    

    struts.xml:

    <constant name="struts.action.extension" value="html, jsp" />
    ...
    <package name="globals" extends="struts-default" namespace="/">
        ...
        <action name="error403">
            <result>/WEB-INF/pages/error/403.jsp</result>
        </action>
        ...
    </package>
    

    您是否尝试将com.ibm.ws.webcontainer.invokeFiltersCompatibility设置为true?