Java <;f:actionListener>;导致一个;“交易不活跃”;有状态EJB/CDIBean上出现异常,而<;f:setPropertyActionListener>;不

Java <;f:actionListener>;导致一个;“交易不活跃”;有状态EJB/CDIBean上出现异常,而<;f:setPropertyActionListener>;不,java,jsf,jakarta-ee,ejb,cdi,Java,Jsf,Jakarta Ee,Ejb,Cdi,我有一个Seam3视图范围的、有状态的EJBean,用于JSF页面(您可以在第一次阅读时跳过代码): 对于processAction(ActionEvent事件)方法,我必须将接口添加到CollisionManagerbean中,并用@LocalBean对其进行注释。您可以看到上面发布的最后一个类 但是,这会引发一个异常: java.lang.IllegalStateException: Transaction is not active in the current thread. a

我有一个Seam3视图范围的、有状态的EJBean,用于JSF页面(您可以在第一次阅读时跳过代码):

对于
processAction(ActionEvent事件)
方法,我必须将接口添加到
CollisionManager
bean中,并用
@LocalBean
对其进行注释。您可以看到上面发布的最后一个类

但是,这会引发一个异常:

java.lang.IllegalStateException: Transaction is not active in the current thread.
    at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.validateTransactionManager(JavaEETransactionManagerJTSDelegate.java:447)
    at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.setRollbackOnlyDistributedTransaction(JavaEETransactionManagerJTSDelegate.java:344)
    at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.setRollbackOnly(JavaEETransactionManagerSimplified.java:971)
    at com.sun.enterprise.transaction.UserTransactionImpl.setRollbackOnly(UserTransactionImpl.java:257)
    at org.jboss.seam.transaction.UTTransaction.setRollbackOnly(UTTransaction.java:82)
    at org.jboss.seam.transaction.DefaultSeamTransaction.setRollbackOnly(DefaultSeamTransaction.java:104)
    at org.jboss.seam.faces.transaction.UnexpectedExceptionObserver.processEvent(UnexpectedExceptionObserver.java:48)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:267)
    at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52)
    at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137)
    at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:263)
    at org.jboss.weld.introspector.jlr.WeldMethodImpl.invokeOnInstance(WeldMethodImpl.java:170)
    at org.jboss.weld.introspector.ForwardingWeldMethod.invokeOnInstance(ForwardingWeldMethod.java:51)
    at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:154)
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:245)
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:233)
    at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:213)
    at org.jboss.weld.manager.BeanManagerImpl.notifyObservers(BeanManagerImpl.java:590)
    at org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:580)
    at org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:575)
    at org.jboss.seam.faces.event.SystemEventBridge.processEvent(SystemEventBridge.java:69)
    at org.jboss.seam.faces.event.DelegatingSystemEventListener.processEvent(DelegatingSystemEventListener.java:51)
    at javax.faces.event.SystemEvent.processListener(SystemEvent.java:106)
    at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2168)
    at com.sun.faces.application.ApplicationImpl.invokeListenersFor(ApplicationImpl.java:2144)
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:302)
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:246)
    at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:670)
    at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:670)
    at org.jboss.seam.faces.environment.SeamApplicationWrapper$Proxy$_$$_WeldClientProxy.publishEvent(SeamApplicationWrapper$Proxy$_$$_WeldClientProxy.java)
    at com.sun.faces.lifecycle.Phase.queueException(Phase.java:160)
    at com.sun.faces.lifecycle.Phase.queueException(Phase.java:149)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:104)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
    at de.company.project.filter.encoding.EncodingFilter.doFilter(EncodingFilter.java:62)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
    at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
    at org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:65)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
    at org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
    at de.company.project.filter.security.LoginFilter.doFilter(LoginFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:722)
作为补丁,我尝试了一个
,传递当前列表实体:

<p:commandButton icon="ui-icon ui-icon-flag"
                 process="@this"
                 update=":state-change-dialog :collision-form:list"
                 oncomplete="stateChangeDialog.show();">
    <f:setPropertyActionListener target="#{collisionManager.selectedCollision}" value="#{cln}" />
    <f:setPropertyActionListener target="#{collisionManager.reloadCollision}" value="#{cln}" />
    <f:setPropertyActionListener target="#{collisionManager.selectedStateChangeCollision}" value="#{cln}" />
</p:commandButton>

此OTOH不会引发异常。这真的让我想知道

Q

为什么这会与
(调用方法
setReloadCollision(Collision-selectedCollision)
)一起工作,但与
(调用方法
processAction(ActionEvent事件)
)一起失败

请注意,我在两个侦听器方法的所有变体中尝试了
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@TransactionAttribute(TransactionAttributeType.REQUIRES\u NEW)
,但均未成功

非常感谢您的帮助

增编:

  • 谁应该知道这件事
  • “普通”JavaEE开发人员应该如何知道
  • 这些信息隐藏在哪里

  • 谢谢

    我认为还有另一个例外导致了这个问题,但不知怎么的,它被吞没了。查看stacktrace,我会尝试在

    org.jboss.seam.faces.transaction.UnexpectedExceptionObserver.processEvent(UnexpectedExceptionObserver.java:48)


    看看那里发生了什么。调用UnexpectedExceptionObserver.processEvent后,Seam正在将事务设置为仅回滚,就像它在异常后一样,例如NullPoInterException。

    如果您对业务操作使用
    action
    而不是
    actionListener
    ,则第一次尝试应该有效。动作监听器就是按照它们在组件上声明的顺序执行的(而且并不完全是为了执行业务动作,因为它们根本不传播异常,从而使最终用户没有任何形式的反馈)。你是说第一个发布的吗?问题是,我想显示一个对话框,并在显示的重载列表中选择第一个元素。目前的方法是在所有按钮按下后使用另一个属性操作侦听器。我会更新这个问题。我认为我没有使用正确的方法来处理bean中的实体。感谢您的建议。重新加载的列表是选定的(选中的)元素/行。只是想知道,是什么要求让您认为您需要一个名为@ViewScoped@Stateful@LocalBean的
    ?为什么不只是一个名为@ViewScoped的
    @bean呢?此外,通过
    操作
    您可以直接传入
    cln
    ,而无需
    <p:commandButton icon="ui-icon ui-icon-flag"
                     actionListener="#{collisionManager.reloadSelectedCollisions}"
                     process="@this"
                     update=":state-change-dialog :collision-form:list"
                     oncomplete="stateChangeDialog.show();">
        <f:setPropertyActionListener target="#{collisionManager.selectedCollision}" value="#{cln}" />
        <f:setPropertyActionListener target="#{collisionManager.selectedStateChangeCollision}" value="#{cln}" />
    </p:commandButton>
    
    <p:commandButton icon="ui-icon ui-icon-flag"
                     process="@this"
                     update=":state-change-dialog :collision-form:list"
                     oncomplete="stateChangeDialog.show();">
        <f:setPropertyActionListener target="#{collisionManager.selectedCollision}" value="#{cln}" />
        <f:actionListener type="de.company.project.CollisionManager" />
        <f:setPropertyActionListener target="#{collisionManager.selectedStateChangeCollision}" value="#{cln}" />
    </p:commandButton>
    
    java.lang.IllegalStateException: Transaction is not active in the current thread.
        at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.validateTransactionManager(JavaEETransactionManagerJTSDelegate.java:447)
        at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.setRollbackOnlyDistributedTransaction(JavaEETransactionManagerJTSDelegate.java:344)
        at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.setRollbackOnly(JavaEETransactionManagerSimplified.java:971)
        at com.sun.enterprise.transaction.UserTransactionImpl.setRollbackOnly(UserTransactionImpl.java:257)
        at org.jboss.seam.transaction.UTTransaction.setRollbackOnly(UTTransaction.java:82)
        at org.jboss.seam.transaction.DefaultSeamTransaction.setRollbackOnly(DefaultSeamTransaction.java:104)
        at org.jboss.seam.faces.transaction.UnexpectedExceptionObserver.processEvent(UnexpectedExceptionObserver.java:48)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:267)
        at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52)
        at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137)
        at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:263)
        at org.jboss.weld.introspector.jlr.WeldMethodImpl.invokeOnInstance(WeldMethodImpl.java:170)
        at org.jboss.weld.introspector.ForwardingWeldMethod.invokeOnInstance(ForwardingWeldMethod.java:51)
        at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:154)
        at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:245)
        at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:233)
        at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:213)
        at org.jboss.weld.manager.BeanManagerImpl.notifyObservers(BeanManagerImpl.java:590)
        at org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:580)
        at org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:575)
        at org.jboss.seam.faces.event.SystemEventBridge.processEvent(SystemEventBridge.java:69)
        at org.jboss.seam.faces.event.DelegatingSystemEventListener.processEvent(DelegatingSystemEventListener.java:51)
        at javax.faces.event.SystemEvent.processListener(SystemEvent.java:106)
        at com.sun.faces.application.ApplicationImpl.processListeners(ApplicationImpl.java:2168)
        at com.sun.faces.application.ApplicationImpl.invokeListenersFor(ApplicationImpl.java:2144)
        at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:302)
        at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:246)
        at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:670)
        at javax.faces.application.ApplicationWrapper.publishEvent(ApplicationWrapper.java:670)
        at org.jboss.seam.faces.environment.SeamApplicationWrapper$Proxy$_$$_WeldClientProxy.publishEvent(SeamApplicationWrapper$Proxy$_$$_WeldClientProxy.java)
        at com.sun.faces.lifecycle.Phase.queueException(Phase.java:160)
        at com.sun.faces.lifecycle.Phase.queueException(Phase.java:149)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:104)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
        at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
        at de.company.project.filter.encoding.EncodingFilter.doFilter(EncodingFilter.java:62)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
        at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
        at org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:65)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
        at org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
        at de.company.project.filter.security.LoginFilter.doFilter(LoginFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
        at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
        at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
        at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
        at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
        at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
        at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
        at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
        at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
        at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
        at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
        at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
        at java.lang.Thread.run(Thread.java:722)
    
    <p:commandButton icon="ui-icon ui-icon-flag"
                     process="@this"
                     update=":state-change-dialog :collision-form:list"
                     oncomplete="stateChangeDialog.show();">
        <f:setPropertyActionListener target="#{collisionManager.selectedCollision}" value="#{cln}" />
        <f:setPropertyActionListener target="#{collisionManager.reloadCollision}" value="#{cln}" />
        <f:setPropertyActionListener target="#{collisionManager.selectedStateChangeCollision}" value="#{cln}" />
    </p:commandButton>