Java 如何预防;本地事务已经有1个非XA资源“;例外?

Java 如何预防;本地事务已经有1个非XA资源“;例外?,java,persistence,ejb,transactions,jax-rs,Java,Persistence,Ejb,Transactions,Jax Rs,我在无状态EJB中使用2个PU,每个PU都在一个方法上调用: @PersistenceContext(unitName="PU") private EntityManager em; @PersistenceContext(unitName="PU2") private EntityManager em2; @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW ) public void getCandidates(final

我在无状态EJB中使用2个PU,每个PU都在一个方法上调用:

@PersistenceContext(unitName="PU")
private EntityManager em;
@PersistenceContext(unitName="PU2")
private EntityManager em2;

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW )
public void getCandidates(final Integer eventId) throws ControllerException {
    ElectionEvent electionEvent = em.find(ElectionEvent.class, eventId);
    ...
    Person person = getPerson(candidate.getLogin());
    ...
}

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW )
private Person getPerson(String login) throws ControllerException {
    Person person = em2.find(Person.class, login);
    return person;
}
这些方法用REQUIRES_NEW transaction注释以避免此异常。当我从JavaFXApplet调用这些方法时,所有方法都按预期工作。现在我正试图从JAX-RSWebService调用它们(我看不出任何逻辑上的差异,因为在这两种情况下ejb都是在初始上下文中查找的),并且我一直得到这个异常。当我在GlassFish2.1连接池中设置Xadasource时,我在em2上遇到了nullpointer异常

你知道下一步该怎么做吗

问候

我在无状态EJB中使用2个PU,每个PU都在一个方法上调用

的确如此。但是您正在从第一个方法调用第二个方法,因此您正在执行分布式事务,并且您需要为此使用XA(至少对其中一个资源使用XA,因为GlassFish支持允许涉及一个非XA资源)。换句话说,将其中一个数据源设置为
XADataSource

如果执行此操作时出现错误,请准确地添加有关您所做操作的详细信息以及stacktrace。

现在问题解决了。我将与大家分享,以防有人被类似的事情缠住。 整个问题在于netbeans的部署。它们会覆盖glassfish连接池中的设置,当您在运行时正确设置它们时,您会得到npe或丢失的密码。编辑此内容的位置是sun resources.xml。XML元素具有属性datasource classname和rs type。对于Derby数据库,需要做的是:

<jdbc-connection-pool ... 
        datasource-classname="org.apache.derby.jdbc.ClientXADataSource" 
        res-type="javax.sql.XADataSource">
   ...
</jdbc-connection-pool>

...

现在工作起来很有魅力。

当从第一个方法调用第二个方法时,它不是EJB方法调用。它将其视为常规方法调用,而不查看
@TransactionAttribute
。如果希望调用同一个EJB,可以插入
SessionContext
并调用
getBusinessObject
。然后在返回的EJB上调用该方法。

另请参见,谢谢,我会尽快发布它,但同时,有没有办法在persistence.xml中指定XADataSource?我在任何地方都找不到它,每次通过netbeans部署时,连接池中的glassfish设置都会恢复为普通数据源。