我在JSP标记文件中引用静态内部类时遇到问题.我正在使用Glassfish Jersey和Jetty 6.1.X. 我正在使用JSP 2.0和标记文件,我没有任何TagHandler类或任何.tld文件.我的web.xml也不包含任何有关JSP或标记文件的具体内容.
我把问题分解成最小的可重复性:
这是我正在使用的类的结构:
package test;
public class OuterClass {
public static class InnerClass {
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的.tag文件的完整内容:
<%@ attribute name="inner" required="true" type="test.OuterClass.InnerClass" %>
<h1>${inner}</h1>
Run Code Online (Sandbox Code Playgroud)
(标记文件在IntelliJ中显示错误):

我在我的父jsp中使用此标记,如下所示:
<%@taglib tagdir="/WEB-INF/tags" prefix="test" %>
<test:test inner="${inner}"/>
Run Code Online (Sandbox Code Playgroud)
尝试以这种方式使用它时得到的例外是:
org.apache.jasper.JasperException: /WEB-INF/jsp/test.jsp(54,4)
Unknown attribute type (test.OuterClass.InnerClass) for attribute inner
Run Code Online (Sandbox Code Playgroud)
如果我更改类型以使用二进制表示法(OuterClass $ InnerClass),我会收到此错误:
The nested type test.OuterClass$InnerClass cannot be referenced using its binary name
Run Code Online (Sandbox Code Playgroud)
我已经搜索了Google,并发现其他人遇到了同样的问题,但所有这些似乎都已经解决了几年前对Jasper的修复.
https://issues.apache.org/bugzilla/show_bug.cgi?id=41824 https://issues.apache.org/bugzilla/show_bug.cgi?id=35351
我通过将类拆分为许多顶级类来绕过问题,但我的用例中的嵌套类必然属于顶级类,不应在此之外使用,因此更改设计应该是错误的我在这里找到的限制.
如果有一种方法可以在标记属性中正确使用静态嵌套类,那么这将是理想的解决方案.