我试图在@Singleton SessionBean - EJB 3.1 - 中获取 TransactionManager 来控制我的事务范围,因为我必须通过@PostConstruct 方法访问数据库。如果发生异常,我不能让 Container RollBack 因为它抛出 TransactionRolledbackException: setRollbackOnly 从单例 post 构造方法中调用。
我正在使用 JTA 数据源并定义了 @TransactionManagement(TransactionManagementType.BEAN) 来覆盖对事务的控制。
@Resource 私有事务管理器事务管理器;
当我尝试执行“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 工作。感谢您的回答。