[
https://issues.apache.org/jira/browse/OFBIZ-12721?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17792602#comment-17792602
]
Ioan Eugen Stan commented on OFBIZ-12721:
-----------------------------------------
The issue here is with the call to `useDaylightTime` which calls an internal
API: `sun.util.calendar.ZoneInfo` .
```
${timeZone.getDisplayName(timeZone.useDaylightTime(),
Static["java.util.TimeZone"].LONG, locale)}
```
The call is used when getting the display name for the timezone.
We can get the display name for the timezone in other ways to avoid the call to
useDaylightTime .
I used this code to convert to ZoneId which has an API for display name :
[https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/ZoneId.html#getDisplayName(java.time.format.TextStyle,java.util.Locale)]
.
```
${timeZone.toZoneId()}
```
However the API needs
[https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/format/TextStyle.html]
which I don't know how to use in FreeMarker :D .
Something like this ( I would setup a template helper method perhaps)
```
timeZone.toZoneId().getDisplayName(java.time.format.TextStyle.FULL, locale)
```
Running this code in jshell works
```
jshell>
java.util.TimeZone.getDefault().toZoneId().getDisplayName(java.time.format.TextStyle.FULL,
java.util.Locale.forLanguageTag("ro-RO"))
$2 ==> "Ora Europei de Est"
```
However, not going through the displayName is better IMO:
```
jshell> java.util.TimeZone.getDefault().toZoneId()
$1 ==> Europe/Bucharest
```
> Replace all occurrences of java.util.TimeZone by java.time.ZoneId
> -----------------------------------------------------------------
>
> Key: OFBIZ-12721
> URL: https://issues.apache.org/jira/browse/OFBIZ-12721
> Project: OFBiz
> Issue Type: Sub-task
> Components: ALL COMPONENTS
> Affects Versions: Upcoming Branch
> Environment: Java 17
> Reporter: Jacques Le Roux
> Assignee: Ioan Eugen Stan
> Priority: Major
>
> Using JDK 17, we have this issue:
> {noformat}
> 2022-12-06 19:04:30,689 |sse-nio-8443-exec-10 |FreeMarkerWorker
> |E| null
> freemarker.core._TemplateModelException: Java method
> "sun.util.calendar.ZoneInfo.useDaylightTime()" threw an exception when
> invoked on sun.util.calendar.ZoneInfo object
> "sun.util.calendar.ZoneInfo[id=\"Europe/Paris\",offset=3600000,dstSa
> vings=3600000,useDaylight=true,transitions=184,lastRule=java.util.SimpleTimeZone[id=Europe/Paris,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,start
> TimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]]";
> see cause exception in the Java stack trace.
> ----
> FTL stack trace ("~" means nesting-related):
> - Failed at: ${timeZone.getDisplayName(timeZone.us... [in template
> "component://helveticus/template/includes/Footer.ftl" at line 21, column 98]
> ----
> at
> freemarker.ext.beans._MethodUtil.newInvocationTemplateModelException(_MethodUtil.java:292)
> ~[freemarker-2.3.31.jar:2.3.31]
> [...]
> Caused by: java.lang.IllegalAccessException: class
> freemarker.ext.beans.BeansWrapper cannot access class
> sun.util.calendar.ZoneInfo (in module java.base) because module java.base
> does not export sun.util.calendar to unnamed module @1c852c0f
> at
> jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392)
> ~[?:?]
> at
> java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:674)
> ~[?:?]
> at java.lang.reflect.Method.invoke(Method.java:560) ~[?:?]
> at
> freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1552)
> ~[freemarker-2.3.31.jar:2.3.31]
> at
> freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:73)
> ~[freemarker-2.3.31.jar:2.3.31]
> ... 85 more
> {noformat}
> [The var timeZone is accessible in screen
> context|https://cwiki.apache.org/confluence/display/OFBIZ/Variables+always+available+in+screen+context].
> The java.util.TimeZone class uses sun.util.calendar.ZoneInfo internally.
> It's no longer supported by Java 17. We need to replace all occurrences of
> java.util.TimeZone by java.time.ZoneId.
> An easy temporary solution is to set
> {{--add-exports=java.base/sun.util.calendar=ALL-UNNAMED}} in build.gradle:
> :
> ['-Xms128M','-Xmx1024M','-Djdk.serialFilter=maxarray=100000;maxdepth=20;maxrefs=1000;maxbytes=500000','--add-exports=java.base/sun.util.calendar=ALL-UNNAMED']
> It has no impact with JDK 11.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)