2

我们正在将我们的服务器从 WAS 7 迁移到 WAS 8,并面临 WAS 7 中不会发生的问题:如果请求的 URL 无效,WAS 7 会响应我们设置的自定义错误页面web.xml,这是一个 JSP 并使用 Struts标签。然而,在 WAS 8 中,它没有,并在下面显示错误页面/堆栈跟踪。只有在无效的 URL 没有默认的 struts 扩展时才会发生这种情况,所以我认为问题出在web.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 在 WAS 8 上处理自定义错误页面?请注意,我们仍然使用相同的配置文件,并且仍然指向 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">
4

2 回答 2

2

联系产品支持后,解决方案是向 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 不会将请求传递给任何过滤器(因为没有映射)。

于 2012-09-17T13:58:03.553 回答
1

在使用包含 Struts2 标记的自定义错误页面从 WAS 6.1 迁移到 WAS 8.5 期间,我遇到了同样的问题。

因为您使用 Struts2 标记,所以您必须在 struts.xml 中定义您的 JSP。请参阅下面的示例。

网页.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?

于 2012-08-30T07:20:27.023 回答