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 方法是:
- 将您的 jsp 定义为
web.xml
中的错误页面:
<error-page>
<location>/error.jsp</location>
</error-page>
- 通过在顶部添加
isErrorPage="true"
将您的页面定义为“错误页面”。这会将隐式 exception
对象添加到页面。
<%@ page language="java" isErrorPage="true"%>
- 使用
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);
我正在将一个项目从 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 方法是:
- 将您的 jsp 定义为
web.xml
中的错误页面:
<error-page>
<location>/error.jsp</location>
</error-page>
- 通过在顶部添加
isErrorPage="true"
将您的页面定义为“错误页面”。这会将隐式exception
对象添加到页面。
<%@ page language="java" isErrorPage="true"%>
- 使用
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);