我在JSP标记文件中引用静态内部类时遇到问题。我正在使用Glassfish Jersey和Jetty 6.1.X.我正在使用JSP 2.0和tagfiles,我没有任何TagHandler类或任何.tld文件。我的web.xml也不包含任何有关JSP或标记文件的特定内容。
我已将问题分解为最小的可重现性:
这是我正在使用的类的结构:
package test;
public class OuterClass {
public static class InnerClass {
}
}
这是我的.tag文件的完整内容:
<%@ attribute name="inner" required="true" type="test.OuterClass.InnerClass" %>
<h1>${inner}</h1>
(标签文件在IntelliJ中显示错误):
我在我的父jsp中使用此标记,如下所示:
<%@taglib tagdir="/WEB-INF/tags" prefix="test" %>
<test:test inner="${inner}"/>
尝试以这种方式使用它时得到的例外是:
org.apache.jasper.JasperException: /WEB-INF/jsp/test.jsp(54,4)
Unknown attribute type (test.OuterClass.InnerClass) for attribute inner
如果我更改类型以使用二进制表示法(OuterClass $ InnerClass),我会收到此错误:
The nested type test.OuterClass$InnerClass cannot be referenced using its binary name
我已经在谷歌搜索过这个问题,并发现其他人遇到了同样的问题,但所有这些似乎都是通过几年前对Jasper的修复解决的。
https://issues.apache.org/bugzilla/show_bug.cgi?id=41824 https://issues.apache.org/bugzilla/show_bug.cgi?id=35351
我通过将类拆分为许多顶级类来绕过问题,但我的用例中的嵌套类必然属于顶级类,不应该在此之外使用,所以感觉不对由于我在这里找到的限制而改变设计。
如果有一种方法可以在标记属性中正确使用静态嵌套类,那么这将是理想的解决方案。