我在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
答案 0 :(得分:29)
我删除了目录
domains/domainx/generated/policy/<appname>/
并且完全重新部署(不仅仅是重新启动)应用程序..它现在按预期工作。
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: Client not authorized for this invocation. at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:... at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(...)
解决方案
检查EJB模块(
.jar
) 或web模块(.war
)打包在 一个应用程序(.ear
),但没有 拥有角色映射信息 应用程序级别,特定于Sun,sun-application.xml
。任何 应用程序(.ear
),安全性 角色映射信息必须是 在sun-application.xml
中指定。它 两者都可以接受 模块级XML和应用程序级 XML。
我不知道你的背景是否有意义。
如果没有,可以查看以下帖子Persisting Entity: javax.ejb.AccessLocalException: Client not authorized for this invocation。其中一张海报建议将SECURITY Logger的日志记录级别设置为FINE [这样] Glassfish策略子系统将记录描述失败权限检查性质的详细消息。这可能有所帮助。我不能告诉你,如果你遇到同样的问题,但OP通过清理生成的策略文件解决了他的问题:
答案 1 :(得分:5)
如果您尝试使用新方法复制和粘贴EJB会话bean,作为修补错误或合并新功能的补丁文件,也会发生此异常。重新启动服务器或禁用&amp;启用企业应用程序无济于事,因为必须重新打包和重新部署EJB会话bean或实体,以便App服务器注册新方法并检查和授予/排除EJB会话bean中新/更改方法的访问权限
答案 2 :(得分:0)
在将无状态SessionBean(TransactionAttribute.REQUIRES_NEW)注入其他无状态SessionBean时,我遇到了同样的问题。对我来说重新启动服务器为我解决了......
只是想让你知道; - )
答案 3 :(得分:0)
我有同样的问题。我没有对服务使用任何类型的访问控制,但是在glassfish的一个实例上一切正常,在另一个实例上,我得到了这个错误,但仅限于某些方法。我添加了@PermitAll并重新部署了服务,一切都开始工作了。
答案 4 :(得分:0)
至少在Glassfish 3.1.2上,有时上一次更改的bean的迭代会在部署时阻塞Glassfish。应用程序将运行,直到它到达应该调用的任何代码,但不能因为先前部署的类仍然存在。我认为Glassfish可能会跟踪每个代码并阻止新代码调用旧代码,但由于解决方案很简单,我还没有真正担心它:
停止服务器,转到域目录并删除应用程序目录中的所有文件和子目录。然后在生成的和osgi-cache目录中执行相同的操作。重新启动服务器并重建/重新部署。
答案 5 :(得分:0)
我有同样的错误,但我的原因是:
<c:set var="speciesList" value="#{timberSaleController.distinctSaleSpecies}" />
功能:
public List<Species> getDistinctSaleSpecies()
{
return ejbFacade.getDistinctSpeciesForAllSales();
}
当我将set标签更改为此时,它起作用了:
<c:set var="speciesList" value="#{timberSaleController.getDistinctSaleSpecies()}" />