IllegalAccessException с Grails timeZoneSelect тег на Google App Engine / Java - PullRequest
1 голос
/ 13 января 2010

Кто-нибудь использовал тег grails timeZoneSelect на GAE / J? Я столкнулся с ошибкой ниже на движке приложения. Я знаю, что отражение не допускается, но ошибочная строка вызывает прямую публичную функцию (inDaylightTime)? Кто-нибудь знает, как обойти это (за исключением жестко закодированного списка часовых поясов)?

спасибо

Uncaught exception from servlet
org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error processing GroovyPageView: Error executing tag : org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag : java.lang.IllegalAccessException: Reflection is not allowed on public boolean sun.util.calendar.ZoneInfo.inDaylightTime(java.util.Date)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135)
    at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5235)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5233)
    at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24)
    at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:363)
    at com.google.net.rpc.impl.Server$2.run(Server.java:838)
    at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56)
    at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:536)
    at com.google.net.rpc.impl.Server.startRpc(Server.java:793)
    at com.google.net.rpc.impl.Server.processRequest(Server.java:368)
    at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:448)
    at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319)
    at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290)
    at com.google.net.async.Connection.handleReadEvent(Connection.java:466)
    at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:759)
    at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:205)
    at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101)
    at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251)
    at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:394)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag : org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag : java.lang.IllegalAccessException: Reflection is not allowed on public boolean sun.util.calendar.ZoneInfo.inDaylightTime(java.util.Date)

Ответы [ 4 ]

1 голос
/ 05 сентября 2010

у меня ниже работает

public Date getDateWithTimeZone(Date date, String timeZone){
    def tz = TimeZone.getTimeZone(timeZone);
    def cal = Calendar.getInstance()
    cal.setTimeInMillis( date.getTime() )
    cal.setTimeZone( tz )
    def offset = cal.get(Calendar.ZONE_OFFSET)
    date.setTime( date.getTime()+offset )
    return date;
}
1 голос
/ 21 января 2010

У меня была похожая проблема, когда я пытался вызвать TimeZone.getTimeZone (), чтобы получить TimeZone, и обошел его, используя другую библиотеку, Joda Time.

http://joda -time.sourceforge.net / index.html

В этом пакете есть эквивалентные методы времени / даты, которые работают лучше, чем в базовом JDK.

1 голос
/ 18 января 2010

Это характерно для динамических языков, которые используют отражение для вызова методов на солнце. * Объекты, возвращаемые фабричными методами java.util.TimeZone; Я обошел подобное ограничение в материале TimeZone, написав метод-обертку на Java, а затем вызвав этот метод, чтобы вызовы на солнце. * Объекты не были отражены.

0 голосов
/ 18 января 2010

Вот половина того, что я сделал на Java:

package inonit.google.appengine.runtime;

import java.util.*;

public class Methods {
    public int getTimezoneOffset(String timezone, long time) {
        return TimeZone.getTimeZone(timezone).getOffset(time);
    }
}

Мое приложение не Grails, и я не знаю достаточно о Grails, чтобы знать, упростят ли абстракции, определенные Grails, класс, подобный этому, или нет. Но в моем приложении я просто создал экземпляр локальной вспомогательной копии этого объекта и вызвал его, когда мне нужно было рассчитать смещения часового пояса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...