リクエストを消費するWebサービス(jboss seam)があり、さらにその作業をさまざまなseamコンポーネントに委任しています。シームコンポーネントの1つには、Events.instance()。raiseTransactionSuccessEventとしてイベント生成機能があり、このイベントをリッスンしているメソッドは呼び出されません。
構成が不足していますか?
提案してください
@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" />
私はそれを考え出した。結論は、ejbトランザクションとseamトランザクションを混在させることは決してないということです。ejbでejbトランザクション管理を明示的に無効にします。機能した!!。