- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在将大型 JEE8 应用程序移植到 Java 17 时,我在呈现简单的 EL 表达式时偶然发现了 IllegalAccessException
:#{myWarBean.defaultTZ.rawOffset}
。我设法在 SSCCE on github 中重现了这个问题.当您在 Wildfly 应用程序服务器(我使用的是 26.1.1.Final)上运行该应用程序时,您会得到以下堆栈跟踪信息:
SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (default task-1) Error Rendering View[/index.xhtml]: javax.el.ELException: /index.xhtml @23,74 value="raw offset=#{myWarBean.defaultTZ.rawOffset}": java.lang.IllegalAccessException: class javax.el.BeanELResolver cannot access class sun.util.calendar.ZoneInfo (in module java.base) because module java.base does not export sun.util.calendar to unnamed module @6a1cb0de
at com.sun.jsf-impl@2.3.17.SP01//com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:77)
at javax.faces.api@3.1.0.SP01//javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.api@3.1.0.SP01//javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:181)
at javax.faces.api@3.1.0.SP01//javax.faces.component.UIOutput.getValue(UIOutput.java:140)
at com.sun.jsf-impl@2.3.17.SP01//com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:198)
at com.sun.jsf-impl@2.3.17.SP01//com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:328)
at com.sun.jsf-impl@2.3.17.SP01//com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:143)
at javax.faces.api@3.1.0.SP01//javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:600)
at com.sun.jsf-impl@2.3.17.SP01//com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:286)
at com.sun.jsf-impl@2.3.17.SP01//com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:90)
at javax.faces.api@3.1.0.SP01//javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:571)
at javax.faces.api@3.1.0.SP01//javax.faces.component.UIComponent.encodeAll(UIComponent.java:1648)
at javax.faces.api@3.1.0.SP01//javax.faces.component.UIComponent.encodeAll(UIComponent.java:1651)
at javax.faces.api@3.1.0.SP01//javax.faces.component.UIComponent.encodeAll(UIComponent.java:1651)
at com.sun.jsf-impl@2.3.17.SP01//com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:461)
[...]
Caused by: javax.el.ELException: java.lang.IllegalAccessException: class javax.el.BeanELResolver cannot access class sun.util.calendar.ZoneInfo (in module java.base) because module java.base does not export sun.util.calendar to unnamed module @6a1cb0de
at javax.el.api@2.0.0.Final//javax.el.BeanELResolver.getValue(BeanELResolver.java:193)
at com.sun.jsf-impl@2.3.17.SP01//com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:156)
at com.sun.jsf-impl@2.3.17.SP01//com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:184)
at org.glassfish.jakarta.el@3.0.3.jbossorg-4//com.sun.el.parser.AstValue.getValue(AstValue.java:114)
at org.glassfish.jakarta.el@3.0.3.jbossorg-4//com.sun.el.parser.AstValue.getValue(AstValue.java:177)
at org.glassfish.jakarta.el@3.0.3.jbossorg-4//com.sun.el.parser.AstDeferredExpression.getValue(AstDeferredExpression.java:39)
at org.glassfish.jakarta.el@3.0.3.jbossorg-4//com.sun.el.parser.AstCompositeExpression.getValue(AstCompositeExpression.java:44)
at org.glassfish.jakarta.el@3.0.3.jbossorg-4//com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:183)
at org.jboss.weld.core@3.1.9.Final//org.jboss.weld.module.web.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
at org.jboss.weld.core@3.1.9.Final//org.jboss.weld.module.web.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
at com.sun.jsf-impl@2.3.17.SP01//com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:73)
... 73 more
Caused by: java.lang.IllegalAccessException: class javax.el.BeanELResolver cannot access class sun.util.calendar.ZoneInfo (in module java.base) because module java.base does not export sun.util.calendar to unnamed module @6a1cb0de
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:674)
at java.base/java.lang.reflect.Method.invoke(Method.java:560)
at javax.el.api@2.0.0.Final//javax.el.BeanELResolver.getValue(BeanELResolver.java:186)
... 83 more
看来,问题出在访问 java.util.TimeZone
的 EL 表达式。 TimeZone
类在内部使用 sun.util.calendar.ZoneInfo
。而且这似乎不再合法。
这只发生在 Java 17 中。在 Java 11 中运行时,一切正常。
我可以通过在启动 wildfly 时添加以下参数来解决异常:
--add-exports=java.base/sun.util.calendar=ALL-UNNAMED
但是,我认为应该可以在没有此解决方法的情况下运行该示例。
知道我遗漏了什么吗?这甚至可能是 Java/JDK 17 中的错误吗?
最佳答案
它可以使用普通的 Java 应用程序类重现,如下所示:
package com.stackoverflow.q72361100;
import java.lang.reflect.Method;
import java.util.TimeZone;
public class Test {
public static void main(String... args) throws Exception {
TimeZone instance = TimeZone.getDefault();
Class<?> cls = instance.getClass();
Method method = cls.getMethod("getRawOffset");
Object result = method.invoke(instance); // java.lang.IllegalAccessException
System.out.println(result);
}
}
这里的问题是 instance.getClass()
返回 sun.util.calendar.ZoneInfo
因为这是 TimeZone#getDefault()< 返回的实现
。解决方法是使用 TimeZone.class
而不是 instance.getClass()
:
package com.stackoverflow.q72361100;
import java.lang.reflect.Method;
import java.util.TimeZone;
public class Test {
public static void main(String... args) throws Exception {
TimeZone instance = TimeZone.getDefault();
Class<?> cls = TimeZone.class; // Work around
Method method = cls.getMethod("getRawOffset");
Object result = method.invoke(instance);
System.out.println(result);
}
}
我认为这需要更改 EL 规范。理想情况下,如果根据 Method#canAccess()
可以访问该方法,它应该在声明的父类(super class)中进一步搜索然后改用它。
package com.stackoverflow.q72361100;
import java.lang.reflect.Method;
import java.util.TimeZone;
public class Test {
public static void main(String... args) throws Exception {
TimeZone instance = TimeZone.getDefault();
Class<?> cls = instance.getClass();
Method method = getAccessibleMethod(instance, cls, "getRawOffset"); // Look in superclasses as well.
Object result = method.invoke(instance);
System.out.println(result);
}
private static Method getAccessibleMethod(Object instance, Class<?> cls, String methodName) throws NoSuchMethodException {
Method method = cls.getMethod(methodName);
if (method.canAccess(instance)) {
return method;
}
return getAccessibleMethod(instance, cls.getSuperclass(), methodName);
}
}
我在 EL 规范中创建了一个问题:https://github.com/jakartaee/expression-language/issues/188
在他们修复它之前,您可以通过为其添加专用的 getter 来解决它:
public int getDefaultTZrawOffset() {
return getDefaultTZ().getRawOffset();
}
#{myWarBean.defaultTZrawOffset}
关于jsf - 使用 JDK 17 通过 JSF/EL 访问 ZoneInfo 时出现 IllegalAccessException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72361100/
在 Go 程序中,我调用 time.LoadLocation("Europe/Berlin") ,它返回一个错误,指出 open/usr/local/go/lib/time/zoneinfo.zip
本文整理了Java中libcore.util.ZoneInfo.makeTimeZone()方法的一些代码示例,展示了ZoneInfo.makeTimeZone()的具体用法。这些代码示例主要来源于G
本文整理了Java中libcore.util.ZoneInfo.clone()方法的一些代码示例,展示了ZoneInfo.clone()的具体用法。这些代码示例主要来源于Github/Stackove
本文整理了Java中libcore.util.ZoneInfo.getOffset()方法的一些代码示例,展示了ZoneInfo.getOffset()的具体用法。这些代码示例主要来源于Github/
本文整理了Java中libcore.util.ZoneInfo.setID()方法的一些代码示例,展示了ZoneInfo.setID()的具体用法。这些代码示例主要来源于Github/Stackove
本文整理了Java中libcore.util.ZoneInfo.getID()方法的一些代码示例,展示了ZoneInfo.getID()的具体用法。这些代码示例主要来源于Github/Stackove
本文整理了Java中libcore.util.ZoneInfo.()方法的一些代码示例,展示了ZoneInfo.()的具体用法。这些代码示例主要来源于Github/Stackoverflow/Mave
本文整理了Java中libcore.util.ZoneInfo.hasSameRules()方法的一些代码示例,展示了ZoneInfo.hasSameRules()的具体用法。这些代码示例主要来源于G
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 10 年前关闭。 Improve this
我在我的一个测试用例中找到了这个Api Sun.util.calendar.zoneInfo,当我对其进行编译时,我得到了警告消息,上面指出sun.util.calender.ZoneInfo是内部专
我正在编写一个程序,需要能够读取 Linux 上的时区文件。这意味着我需要能够在各个发行版中始终如一地找到它们。据我所知,它们总是位于/usr/share/zoneinfo。问题是,它们实际上总是位于
我正在使用 Docker 创建容器应用程序,然后将其部署到 kubernetes engine但是当应用程序被初始化时,我得到这个错误: err: open C:\Go/lib/time/zonein
本文整理了Java中com.google.cloud.dns.ZoneInfo.of()方法的一些代码示例,展示了ZoneInfo.of()的具体用法。这些代码示例主要来源于Github/Stacko
我有兴趣检索用户当前在 JavaScript 中为其操作系统设置的当前区域信息字符串(“美国/洛杉矶”、“欧洲/伦敦”等)。我已经找到了如何以秒为单位获取当前偏移量、特定日期的偏移量和不太精确的时区(
在 Go 中,您可以通过添加指向要用于时区信息的特定文件的 ZONEINFO 环境变量来指定要使用的特定 zoneinfo.zip 文件。这很棒,因为它使我能够确保我在前端和后端使用的 IANA 时区
本文整理了Java中com.google.cloud.dns.ZoneInfo.getGeneratedId()方法的一些代码示例,展示了ZoneInfo.getGeneratedId()的具体用法。
本文整理了Java中com.google.cloud.dns.ZoneInfo.hashCode()方法的一些代码示例,展示了ZoneInfo.hashCode()的具体用法。这些代码示例主要来源于G
本文整理了Java中com.google.cloud.dns.ZoneInfo.getDescription()方法的一些代码示例,展示了ZoneInfo.getDescription()的具体用法。
本文整理了Java中com.google.cloud.dns.ZoneInfo.getNameServers()方法的一些代码示例,展示了ZoneInfo.getNameServers()的具体用法。
本文整理了Java中com.google.cloud.dns.ZoneInfo.getNameServerSet()方法的一些代码示例,展示了ZoneInfo.getNameServerSet()的具
我是一名优秀的程序员,十分优秀!