我試圖獲得@Singleton SessionBean中的TransactionManager - EJB 3.1 - 來控制我的事務範圍,因爲我必須訪問@PostConstruct方法上的數據庫。如果發生異常,我不能讓Container RollBack,因爲它會引發TransactionRolledbackException:setRollbackOnly在一個單獨的後期構造方法中調用。我如何獲得WebSphere 8.0上的TransactionManager?
我正在使用JTA數據源並定義了@TransactionManagement(TransactionManagementType.BEAN)來覆蓋事務的控制。
@Resource private TransactionManager transactionManager;
返回給我一個NullPointerException當我嘗試做一個「transactionManager.begin();」。有誰知道如何解決這個問題?
UPDATE:
我使用的代碼是這樣的:
@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)
{
}
}
}
我覺得應該有一個JNDI ADRESS對@Resource註釋,一個是具體針對WebSphere補充,但我真的找不到至極。
更新:
爲什麼在容器託管注入上使用JNDI?由於我從直接注入中獲得了空指針異常,因此試圖像使用前一樣使用。從OReilly Enterprise Java Beans 3.1第6版開始,
@Resource(mappedName = "java:/TransactionManager")
//mappedName is vendor-specific, and in this case points to an address in JNDI
試過這個沒有成功。
UPDATE
的WebSphere是沒有得到我們的豆註釋 - 不知道爲什麼 - 這樣的註解:
@TransactionManagement(TransactionManagementType.BEAN)
不能正常工作。因此,編輯了de ejb-jar.xml並添加了以下代碼:
<transaction-type>Bean</transaction-type>
和UserTransaction起作用。感謝您的答案。
mappedName在websphere中不受支持。 – 2013-04-27 02:18:49