首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JPA Glassfish数据库更新问题

JPA Glassfish数据库更新问题
EN

Stack Overflow用户
提问于 2010-08-27 17:00:10
回答 6查看 14.3K关注 0票数 12

我在Glassfish v3.0.1上部署了一个应用程序,它从我的数据库中的一个表中读取事件。一旦准备就绪,它就会将它们标记为已处理。当我试图调用执行更新的方法时,我得到了一个奇怪的错误,我无法解释。

代码语言:javascript
复制
@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);
    }
}

当在我的应用程序中调用它时,我得到了以下异常(文章底部的完整跟踪):

代码语言:javascript
复制
Caused by: javax.ejb.AccessLocalException: Client not authorized for this invocation.

有人知道是什么原因导致这个错误吗?我在网上查找,但没有找到任何有用的东西。

代码语言:javascript
复制
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
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-08-28 10:19:11

我已经删除了目录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:客户端未被授权进行此调用。在com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:...在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。其中一个发帖者建议将安全记录器的日志记录级别设置为FINE,以便Glassfish策略子系统将记录描述失败权限检查的性质的详细消息。这可能会有帮助。我不能告诉你你是否面临着同样的问题,但是操作员通过清理生成的策略文件解决了他的问题:

票数 29
EN

Stack Overflow用户

发布于 2011-12-01 19:15:27

如果您试图使用新方法复制和粘贴EJB会话bean,作为修复bug或合并新功能的修补文件,也会发生此异常。重新启动服务器或禁用和启用企业应用程序将没有任何帮助,因为必须重新打包和重新部署EJB会话bean或实体,以便应用程序服务器注册新方法,并检查并授予/排除对EJB会话bean中新的/更改的方法的访问权限。

票数 5
EN

Stack Overflow用户

发布于 2012-12-21 22:09:56

在将无状态SessionBean (TransactionAttribute.REQUIRES_NEW)注入其他无状态SessionBean时,我也遇到了同样的问题。对于我来说重启服务器为我解决了这个问题...

只是想让你知道;-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3582669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档