Java 如何在WebSphere 8.0上获得TransactionManager?
我试图在@Singleton SessionBean-EJB3.1中获取TransactionManager来控制我的事务的范围,因为我必须通过@PostConstruct方法访问数据库。如果发生异常,我不能让容器回滚,因为它会抛出TransactionRolledbackException:setRollbackOnly,该异常是从singleton post构造方法中调用的 我正在使用一个JTA数据源并定义@TransactionManagement(TransactionManagementType.BEAN)来覆盖事务的控制 @资源 私人交易经理 当我尝试执行“transactionManager.begin();”时,向我返回NullPointerException。有人知道如何解决这个问题吗 更新: 我使用的代码如下:Java 如何在WebSphere 8.0上获得TransactionManager?,java,websphere,transactionmanager,Java,Websphere,Transactionmanager,我试图在@Singleton SessionBean-EJB3.1中获取TransactionManager来控制我的事务的范围,因为我必须通过@PostConstruct方法访问数据库。如果发生异常,我不能让容器回滚,因为它会抛出TransactionRolledbackException:setRollbackOnly,该异常是从singleton post构造方法中调用的 我正在使用一个JTA数据源并定义@TransactionManagement(TransactionManagemen
@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)
{
}
}
}
我试过了,但没有成功
更新
WebSphere没有得到我们的beans注释-无法真正了解原因-因此注释:
@TransactionManagement(TransactionManagementType.BEAN)
他没有工作。因此,编辑了de ejb-jar.xml并添加了以下代码:
<transaction-type>Bean</transaction-type>
Bean
而且UserTransaction起作用了。谢谢您的回答。当您有bean管理的事务时,您不使用
javax.transaction.TransactionManager
,而是使用javax.transaction.UserTransaction
然后你打电话给begin,commit。。。。UserTransaction
接口的etc
答案更新:
1)首先,正如我所说的,不要使用TransactionManager
。使用UserTransaction
2)因为您想知道UserTransaction
对象的JNDI名称。它是java:comp/UserTransaction
。但是,只有当您的组件未被管理时,您才需要它。ie:Servlet,EJB。该过程称为手动调用JNDIAPI
3)提供提交()或回滚()。他们都不在
我正在看你们的课,看起来还不错
那么,问题出在哪里?(可能性)
1)您的类未被视为EJB(容器管理),这就是注入失败的原因
2)事务服务在EJB@Startup之前未启动或无法启动
3)您在persistence.xml中配置了JTA数据源。在这种情况下,请尝试:
@Resource
private EJBContext context;
userTransaction = context.getUserTransaction();
注意:还请提供完整的堆栈跟踪和persistence.xml,以查明确切的问题。以下是一些使用UserTransaction来控制事务的正确运行的示例代码
@Singleton
@Startup
@TransactionManagement(TransactionManagementType.BEAN)
public class SampleUT {
Logger logger = Logger.getLogger(SampleUT.class.getName());
@Resource
private UserTransaction ut;
@PostConstruct
public void postConstruct()
{
logger.info("PostConstruct called");
try {
ut.begin();
...
您得到的NullPointerException可能与您试图在EJB的构造函数中使用注入的资源有关。您应该知道,在EJB的构造函数完成之前,注入的引用永远不可用,因此如果您尝试在构造函数内使用任何注入的引用,它将抛出NullPointerException 在编程(BMT)会话bean中不需要使用事务管理器,除非在某些情况下希望挂起()或恢复()关联的事务,否则请改用UserTransaction 但是,您可以使用静态方法getTransactionManager()通过com.ibm.ws.Transaction.TransactionManagerFactory类获得对websphere中事务管理器的引用
谢谢你的回答。我知道注入是在bean实例准备好之后进行的,这就是为什么我在@PostConstruct方法中使用注入的引用。明天我一上班就会发布bean代码。再次感谢。我已经通过注入使用了UserTransactin,并且遇到了同样的问题。粘贴原始代码。没有使用commit()或rollback(),因为我必须在完成其余事务处理之前解决此问题。我将尝试改用UserTransaction,并将使用结果进行更新。websphere中不支持mappedName。
@Singleton
@Startup
@TransactionManagement(TransactionManagementType.BEAN)
public class SampleUT {
Logger logger = Logger.getLogger(SampleUT.class.getName());
@Resource
private UserTransaction ut;
@PostConstruct
public void postConstruct()
{
logger.info("PostConstruct called");
try {
ut.begin();
...
public TransactionManager getTransactionManager() {
return TransactionManagerFactory.getTransactionManager();
}