Подтвердить что ты не робот

Проблема обновления базы данных 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
4b9b3361

Ответ 1

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

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

javax.ejb.AccessLocalException: Неавторизованная ошибка клиента

Описание

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

[...INFO|sun-appserver-pe8.0|javax.enterprise.system.container.ejb|...|
javax.ejb.AccessLocalException: Client not authorized for this invocation.
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:...
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(...)

Решение

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

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

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

Ответ 2

Это исключение также может возникнуть, если вы попытаетесь скопировать и вставить сеанс EJB beans с новыми методами, в качестве файлов исправлений для исправления ошибок или включения новых функций. Перезапуск сервера или отключение и включение корпоративного приложения не помогут, так как сеанс EJB beans или сущности должны быть переупакованы и перераспределены, так что сервер приложений регистрирует новые методы и проверяет и предоставляет/исключает права доступа к новые/измененные методы в сеансе EJB beans.

Ответ 3

У меня была такая же проблема, когда вы вводили SessionState SessionBean (TransactionAttribute.REQUIRES_NEW) в другой SessionBean без состояния. Для меня перезапуск сервера решил это для меня...

Просто хочу сообщить вам, -)

Ответ 4

У меня была такая же проблема. Я не использую какой-либо контроль доступа на службе, но на одном экземпляре Glassfish все работает нормально, а с другой, я получил эту ошибку, но только по некоторым методам. Я добавил @PermitAll и перераспределил сервис, и все началось.

Ответ 5

В Glassfish 3.1.2 по крайней мере иногда предыдущая итерация bean, которая изменилась, закроет Glassfish при развертывании. Приложение будет работать до тех пор, пока не получит какой-то бит кода, который должен быть вызван, но не может быть, потому что ранее развернутый класс все еще существует. Я думаю, что Glassfish может отслеживать каждый и не позволять новому коду вызывать старый код, но я не очень хотел его беспокоиться, поскольку решение достаточно просто:

Остановите сервер, перейдите в каталог домена и удалите все файлы и подкаталоги в каталоге приложения. Затем выполните то же самое в сгенерированных и osgi-кеш-каталогах. Перезагрузите сервер и перестройте/переустановите.

Ответ 6

У меня была такая же ошибка, но моя причина была вызвана:

<c:set var="speciesList" value="#{timberSaleController.distinctSaleSpecies}"   />

функция:

public List<Species> getDistinctSaleSpecies()
    {
        return ejbFacade.getDistinctSpeciesForAllSales();
    }

когда я сменил тег установки на это, он сработал:

<c:set var="speciesList" value="#{timberSaleController.getDistinctSaleSpecies()}"   />