JSP-Error: Only a type can be imported. com.ibm.ws.webcontainer.webapp.WebAppErrorReport resolves to a package

JSP-Error: Only a type can be imported. com.ibm.ws.webcontainer.webapp.WebAppErrorReport resolves to a package

我正在将一个项目从 Websphere 服务器迁移到 OpenLiberty-21.0.0.1 以及其他技术堆栈。虽然 运行 应用程序在 JSP 页面之一中给我运行时错误,如下所示:

Only a type can be imported. com.ibm.ws.webcontainer.webapp.WebAppErrorReport resolves to a package

.jsp 页面中有此 class 的导入内容,如下所示:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
   <%@page import="com.ibm.ws.webcontainer.webapp.WebAppErrorReport"%>
   
    <html>
    <head>

我怀疑这个错误是因为所需的 jar 不在我的服务器中,所以我尝试在我的 Openliberty 安装的 /lib 目录中搜索名称以 com.ibm.ws.webcontainer.webapp 开头的 jar,但我找不到。我尝试搜索是否有任何 maven 依赖项可用于相同的,但我无法找到。

如有任何帮助,我们将不胜感激。

或以下代码的任何解决方法也可以:

WebAppErrorReport errorReport = (WebAppErrorReport)request.getAttribute("ErrorReport");
Throwable cause = errorReport.getCause();

com.ibm.ws.* 程序包包含 application-server-internal 个不供应用程序使用的 API。这些 classes 在传统的 WebSphere 中可见,但在 Liberty 中不可见。

在使用此 class 的地方添加 jsp 的片段,以便提出解决方法。

您也可以在此处查看 WebAppErrorReport 的来源 https://github.com/OpenLiberty/open-liberty/blob/integration/dev/com.ibm.ws.webcontainer/src/com/ibm/ws/webcontainer/webapp/WebAppErrorReport.java 以自行编写解决方法。

这个 class 通常用于错误 handling/formatting,因此替换它应该不是很难(取决于它在您的应用中的使用方式)。

更新:

简单、干净的 Java EE 方法是:

  1. 将您的 jsp 定义为 web.xml 中的错误页面:
    <error-page>
        <location>/error.jsp</location>
    </error-page>   
  1. 通过在顶部添加 isErrorPage="true" 将您的页面定义为“错误页面”。这会将隐式 exception 对象添加到页面。
<%@ page language="java" isErrorPage="true"%>
  1. 使用exception对象。所以而不是:
WebAppErrorReport errorReport = (WebAppErrorReport)request.getAttribute("ErrorReport");
Throwable cause = errorReport.getCause();

您只需使用 exception 例如:

out.println("Exception: " + exception.getMessage());

exception 是您代码中的 cause 对象。

如果您想了解有关错误页面中可用属性的更多详细信息,请查看:How to get the message in a custom error page

如果你真的必须使用 WebAppErrorReport,我强烈反对,你可以使用丑陋的反射技巧:

Object myReport = request.getAttribute("ErrorReport");
Class myClass = myReport.getClass();
Method myMethod = myClass.getMethod("getCause", (Class[])null);
Throwable cause = (Throwable)myMethod.invoke(myReport, (Object[])null);