Проблема с обновлением базы данных JPA Glassfish

У меня есть приложение, развернутое на Glassfish v3.0.1, которое считывает события из таблицы в моей базе данных. Когда они будут готовы, он помечает их как обработанные. Я получаю странную ошибку, которую не могу объяснить, при попытке вызвать метод, выполняющий обновление.

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void markEventAsProcessed(Long eventId) {
    try {
       AtlasEventQueueUpdateAsProcessedQuery setEventAsProcessed = new  AtlasEventQueueUpdateAsProcessedQuery(entityManager, eventId);
       int updateCount = setEventAsProcessed.execute();
       logger.debug("Mark Event [" + eventId + "] processed");
       return updateCount;
    } catch (QueryException ex) {
        logger.error("Event [" + eventId + "has not been marked as processed", ex);
    }
}

Когда это вызывается в моем приложении, я получаю следующее исключение (Полная трассировка внизу сообщения):

Caused by: javax.ejb.AccessLocalException: Client not authorized for this invocation.

Кто-нибудь знает, что может вызвать эту ошибку. Я обнаружил в Интернете, что ничего не нашел. полезный.

2010-08-27 09:44:37,380 ERROR [Ejb-Timer-Thread-1  :EventProvider       ] Unhandled exception in event processing - javax.ejb.EJBAccessException
javax.ejb.EJBAccessException
        at com.sun.ejb.containers.BaseContainer.mapLocal3xException(BaseContainer.java:2262)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2053)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
        at $Proxy190.markEventAsProcessed(Unknown Source)
        at com.company.atlas.eventprocessor.provider.EventProvider.processNewEvents(EventProvider.java:170)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1056)
        at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1128)
        at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5292)
        at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
        at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567)
        at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)
        at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundTimeout(SystemInterceptorProxy.java:144)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
        at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367)
        at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5264)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5252)
        at com.sun.ejb.containers.BaseContainer.callEJBTimeout(BaseContainer.java:3965)
        at com.sun.ejb.containers.EJBTimerService.deliverTimeout(EJBTimerService.java:1667)
        at com.sun.ejb.containers.EJBTimerService.access$100(EJBTimerService.java:98)
        at com.sun.ejb.containers.EJBTimerService$TaskExpiredWork.run(EJBTimerService.java:2485)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:619)
Caused by: javax.ejb.AccessLocalException: Client not authorized for this invocation.
        at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1850)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:188)
        ... 34 more
12
задан Lipis 7 June 2013 в 16:18
поделиться

1 ответ

Я удалил каталог domains/domainx/generated/policy// и полностью повторно развернул (а не просто перезапустил) приложение. Теперь оно работает, как и ожидалось.

В документации GlassFish есть запись об этой ошибке:

javax.ejb.AccessLocalException: Client Not Authorized Error

Описание

Доступна информация о сопоставлении ролей в специфичном для Sun XML (например, sun-ejb-jar.xml), и аутентификация все в порядке, но следующая ошибка отображается сообщение:

[...INFO|sun-appserver-pe8.0|javax.enterprise.system.container.ejb|...|
javax.ejb.AccessLocalException: Клиент не авторизован для этого вызова.
в com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:...
в com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(...)

Решение

Проверьте, является ли модуль EJB (.jar) или веб-модуль (.war) упакован в приложение (.ear) и не иметь информацию о ролевой карте в прикладной уровень, специфичный для Sun, sun-application.xml. Для любого приложение (.ear), безопасность информация о сопоставлении ролей должна быть указанный в sun-application.xml. Это допустимо иметь оба XML на уровне модуля и на уровне приложения XML.

Не знаю, имеет ли это смысл в вашем контексте.

Если это не так, возможно, взгляните на следующий поток Сохраняющийся объект: javax.ejb.AccessLocalException: клиент не авторизован для этого вызова . Один из авторов предложил установить уровень ведения журнала SECURITY Logger на FINE [чтобы] подсистема политики Glassfish регистрировала подробное сообщение с описанием характера неудачной проверки разрешений. Это может помочь. И я не могу сказать вам, столкнулись ли вы с той же проблемой, но ОП решил свою проблему, очистив сгенерированные файлы политики:

29
ответ дан 2 December 2019 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: