3

この例外のため、マネージド Bean (jsf ページから使用) から @EJB にアクセスできません

javax.ejb.EJBTransactionRequiredException: 呼び出しにはトランザクションが必要です: org.jboss.invocation.InterceptorContext@353e531e

jsf 部分 (faces-config ページと web.xml ページ) は bean 部分とは別のパッケージにありますが、2 つはデプロイされた EAR にあります。このアプリケーションは jboss 7 にデプロイされています

EJB (ビジネス):

@Stateful
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class DataAccessBusinessImpl implements DataAccessBusiness {

マネージド Bean:

public class ConfigurationBean implements Serializable {
    @EJB
    DataAccessBusiness dab;

Faces-config.xml:

<managed-bean>
<managed-bean-name>configurationBean</managed-bean-name>
<managed-bean-class>ch.morphean.videoaid.lb.managedBean.ConfigurationBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>

web.xml:

<display-name>videoaid-site</display-name>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

ご協力いただきありがとうございます

4

1 に答える 1

2

の EJB 仕様によるとTransactionAttributeType.MANDATORY:

クライアントがトランザクション コンテキストに関連付けられているときにエンタープライズ Bean のメソッドを呼び出すと、コンテナはクライアントのトランザクション コンテキストでエンタープライズ Bean のメソッドを呼び出します。既存のトランザクションがない場合、例外がスローされます。

「クライアント」(マネージド Bean) にはトランザクションが開始されていないため、セッション Bean に で注釈を付けているため、EJB コンテナーは例外をスローしますTransactionAttributeType.MANDATORY

MANDATORY@TransactionAttribute の値として使用する代わりにREQUIRED、既存のトランザクションがない場合にコンテナに強制的にトランザクションを開始させるように使用します。仕様についてTransactionAttributeType.REQUIREDは次のように述べています。

クライアントがトランザクション コンテキストに関連付けられているときにエンタープライズ Bean のメソッドを呼び出すと、コンテナはクライアントのトランザクション コンテキストでエンタープライズ Bean のメソッドを呼び出します。

クライアントがトランザクション コンテキストに関連付けられていないときにクライアントがエンタープライズ Bean のメソッドを呼び出すと、コンテナは、メソッド呼び出しをエンタープライズ Bean メソッドに委譲する前に、新しいトランザクションを自動的に開始します。

于 2013-06-24T10:46:18.293 に答える