java - 我怎样才能在 WebSphere 8.0 上获得 TransactionManager?

标签 java websphere transactionmanager

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

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

@资源 私有(private)交易管理器交易管理器;

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

    }

}

我认为应该有一个 JNDI 地址添加到 @Resource 注释上,一个特定于 WebSphere 的地址,但我真的找不到。

更新:

为什么在容器管理的注入(inject)上使用 JNDI?因为我从直接注入(inject)中得到一个空指针异常,所以尝试像 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 起作用了。感谢您的回答。

最佳答案

当您有 bean 管理的事务时,您不使用 javax.transaction.TransactionManager 而是使用 javax.transaction.UserTransaction

然后调用 UserTransaction 接口(interface)的 begin、commit ....等。

答案已更新:

1) 首先,正如我所说,不要使用 TransactionManager。使用 UserTransaction

2) 因为您想知道 UserTransaction 对象的 JNDI 名称。它是 java:comp/UserTransaction。但是只有当您的组件不受管理时才需要它。 即: Servlet、EJB。该过程称为手动调用 JNDI API

3) 提供commit()rollback()。他们都不在场。

我正在看你的课,看起来还不错。

那么,问题出在哪里? (可能性)

1) 您的类未被视为 EJB(容器管理),这就是注入(inject)失败的原因。

2)事务服务在EJB@Startup之前没有启动或者启动失败。

3) 您在 persistence.xml 中配置了 JTA 数据源。在这种情况下,尝试:

@Resource
private EJBContext context;

userTransaction  = context.getUserTransaction(); 

注意:还请提供完整的堆栈跟踪和persistence.xml 以便查明具体问题。

关于java - 我怎样才能在 WebSphere 8.0 上获得 TransactionManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16221840/

相关文章:

spring - Spring 中的两个实体管理器

java - 为什么我的应用程序停止工作?

java - S3 ListObjectsV2Request 排序参数

java - 如何使用 apache poi 获取 pptx 幻灯片注释文本?

java - 从 TOMCAT 迁移到 IBM Websphere 时出现 ORA-01017 用户名/密码无效

java - 在 Hibernate Spring 中添加 TransactionManager

java - sqlite 和 mysql。当应用程序的所有进程都在同一台机器上运行并且数据库几乎没有 2 个表时,哪个更好

java - 如何在 WebSphere 的 jython 中导入 AdminControl?

java - Cassandra 性能相对于两个应用程序主机是不同的

java - org.hibernate.LazyInitializationException : failed to lazily initialize a collection of role in another environment