@PostConstruct メソッドでデータベースにアクセスする必要があるため、トランザクションのスコープを制御するために @Singleton SessionBean - EJB 3.1 - で TransactionManager を取得しようとしました。例外が発生した場合、コンテナーは TransactionRolledbackException: setRollbackOnly をシングルトン ポスト コンストラクト メソッド内からスローするため、RollBack を許可できません。
私は JTA DataSource を使用しており、トランザクションの制御をオーバーライドするために @TransactionManagement(TransactionManagementType.BEAN) を定義しています。
@Resource プライベート TransactionManager transactionManager;
「transactionManager.begin();」を実行しようとすると、NullPointerException が返されます。誰もこれを解決する方法を知っていますか?
アップデート:
私が使用しているコードはこれです:
@Startup
@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
public class RuntimeContextEJB
{
@EJB
private RepositoryRecursosExternosFactoryEJB repositoryRecursosExternosFactoryEJB;
@EJB
private MetodologiaIndiceLiquidezFactoryEJB metodologiaIndiceLiquidezFactoryEJB;
@EJB
private FuncaoMatematicaFactoryEJB funcaoMatematicaFactoryEJB;
private boolean bootstrapRunning = false;
private List<String> dadosMercadoMonitorados;
@PersistenceContext(unitName = "crv-persistence-unit")
private EntityManager entityManager;
@Resource
private TransactionManager transactionManager;
@PostConstruct
public void init()
{
// comentário
MotorCalculoContext.setupMotorCalculoContext(repositoryRecursosExternosFactoryEJB, metodologiaIndiceLiquidezFactoryEJB,
funcaoMatematicaFactoryEJB);
carregaDadosMercadoMonitorados();
}
public void sinalizarInicioBootstrap()
{
bootstrapRunning = true;
}
public void sinalizarTerminoBootstrap()
{
bootstrapRunning = false;
}
public boolean isBootstrapRunnnig()
{
return bootstrapRunning;
}
public void carregaDadosMercadoMonitorados()
{
try
{
transactionManager.begin();
this.dadosMercadoMonitorados = (List<String>) entityManager
.createQuery(
"SELECT DISTINCT(p.parametro.codigoDadoMercado) FROM PlanoExecucaoPasso p WHERE p.parametro.codigoDadoMercado <> '' AND p.parametro.codigoDadoMercado <> '0'")
.getResultList();
}
catch (Exception e)
{
}
}
}
@Resource アノテーションに追加する JNDI アドレスが必要だと思います。これは、WebSphere に固有のものですが、実際には見つかりません。
アップデート:
コンテナ管理のインジェクションで JNDI を使用する理由 ダイレクトインジェクションでヌルポインタ例外が出てしまうので、ex.のように使ってみました。OReilly Enterprise Java Beans 3.1 第 6 版の 305 ページ。
@Resource(mappedName = "java:/TransactionManager")
//mappedName is vendor-specific, and in this case points to an address in JNDI
これを試してみましたが成功しませんでした。
アップデート
WebSphere は私たちの Bean アノテーションを取得していません - 理由を本当に知ることはできません - したがって、アノテーション:
@TransactionManagement(TransactionManagementType.BEAN)
動作していませんでした。そのため、de ejb-jar.xml を編集し、次のコードを追加しました。
<transaction-type>Bean</transaction-type>
そして UserTransaction が機能しました。答えてくれてありがとう。