0

リクエストを消費するWebサービス(jboss seam)があり、さらにその作業をさまざまなseamコンポーネントに委任しています。シームコンポーネントの1つには、Events.instance()。raiseTransactionSuccessEventとしてイベント生成機能があり、このイベントをリッスンしているメソッドは呼び出されません。

構成が不足していますか?

提案してください

4

3 に答える 3

0
  1. WebサービスからSeamコンポーネントを呼び出すときは、トランザクションが開始されていることを確認してください。そうでない場合は、手動で開始します。
  2. トランザクションが実際にコミットされていることを確認してください。
于 2012-06-30T17:27:34.720 に答える
0

@Tair

以下のようにWebサービスリクエストを消費するejbコンポーネントがあります

@Name("plugin")
@Stateless
@WebService(name = "PluginService", serviceName = "PluginService")
public class PluginService implements IPlugin {
    @WebMethod
    public boolean createUser(String username, String password) {
        System.out.println("in login ");
        WebAuthenticator authenticator = (WebAuthenticator) Component
                .getInstance("webauthenticator");

        usreCreated = authenticator.create(username, password);
        System.out.println("valid user "+validUser);
                return userCreated;
}
}

WebAuthenticatorは、次のようなシームコンポーネントです。

@Name("webauthenticator")
@Scope(ScopeType.CONVERSATION)

public class WebAuthenticator {

    @In
    EntityManager entityManager;

        @Observer("test")
        public void test()
        {
        System.out.println("A transaction success event was fired");
        }

    private static Log log = (Log) Logging.getLog(WebAuthenticator.class);
    private static byte[] accountPassword = null;
    private static Account currentAccount = null;

    public boolean createUser(String username, String password) {

        System.out.println("In web authenticator");
                User user = new User();
                user.username = username;
                user.password = password;
                entityManager.persist(user);
                entityManager.flush();
                Events.instance().raisTransactionSuccessEvent("test");
}
}

components.xmlファイルに、<transaction:ejb-transaction />seamがコンテナトランザクションイベントに関する更新を取得できるようにし、seamで管理された永続コンテキストを設定します。

    <persistence:managed-persistence-context
   auto-create="true" name="entityManager" persistence-unit-jndi-   name="java:/pilotEntityManagerFactory" />
于 2012-07-12T21:31:29.350 に答える
0

私はそれを考え出した。結論は、ejbトランザクションとseamトランザクションを混在させることは決してないということです。ejbでejbトランザクション管理を明示的に無効にします。機能した!!。

于 2012-07-19T21:33:31.287 に答える