Java 如何在WebSphere 8.0上获得TransactionManager?

Java 如何在WebSphere 8.0上获得TransactionManager?,java,websphere,transactionmanager,Java,Websphere,Transactionmanager,我试图在@Singleton SessionBean-EJB3.1中获取TransactionManager来控制我的事务的范围,因为我必须通过@PostConstruct方法访问数据库。如果发生异常,我不能让容器回滚,因为它会抛出TransactionRolledbackException:setRollbackOnly,该异常是从singleton post构造方法中调用的 我正在使用一个JTA数据源并定义@TransactionManagement(TransactionManagemen

我试图在@Singleton SessionBean-EJB3.1中获取TransactionManager来控制我的事务的范围,因为我必须通过@PostConstruct方法访问数据库。如果发生异常,我不能让容器回滚,因为它会抛出TransactionRolledbackException:setRollbackOnly,该异常是从singleton post构造方法中调用的

我正在使用一个JTA数据源并定义@TransactionManagement(TransactionManagementType.BEAN)来覆盖事务的控制

@资源 私人交易经理

当我尝试执行“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)
        {
        }

    }

}
我试过了,但没有成功

更新

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();
}