java - jax-ws 服务中的 "Operation Connection.commit is not allowed during a global transaction"

标签 java web-services hibernate transactions jax-ws

我有一个 jax-ws 服务,但是当我在其中运行 hibernate 事务时,出现以下异常:

Caused by: java.sql.SQLException: DSRA9350E: Operation Connection.commit is not allowed during a global transaction.
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.commit(WSJdbcConnection.java:1104)
    at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:170)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:146)
    ... 47 more

我没有使用 XA 数据源,客户端是一个未连接到任何数据库的 junit。据我所知,我没有对该 Web 服务执行任何操作,导致它认为我想要进行全局事务。我没有在 websphere 中设置任何策略集,事实上,当我查看管理控制台时,我没有看到任何设置。

我的 hibernate 事务使用@Transactional。我的网络服务是这样注释的:

@WebService(targetNamespace = "http://my.domain.enote")
public interface IQueueWS {

@WebMethod(operationName="enqueueCandidate")
public List<String> enqueueCandidate(Candidate candidate);

@WebMethod(operationName="enqueueCandidates")
public List<String> enqueueCandidates(List<Candidate> candidates);

}

在我的实现类的顶部:

@Stateless
@WebService(
        portName = "QueueWSPort",
        serviceName = "QueueWSService",
        targetNamespace = "http://gov.usdoj.afms.enote",
        endpointInterface = "gov.usdoj.afms.enote.webservices.queue.IQueueWS")
public class QueueWS {

然后在客户端:

        Service client = Service.create(
            new URL("http://localhost:9080/eNotesApp/QueueWSService?wsdl"),
            new QName("http://gov.usdoj.afms.enote", "QueueWSService"));

    IQueueWS queue = client.getPort(IQueueWS.class);
    Candidate c = new Candidate();
    //blah blah, deleted for brevity
    List<String> errors = queue.enqueueCandidate(c);

我曾经使用 eclipse 的 wsgen 向导来生成服务,所以这是我第一次尝试仅使用注释......并且它们的工作范围是控制通过正确的参数到达需要的位置。正是这种事务性的事情阻碍了我们。

最佳答案

我认为您的 @WebService 是事务性的,是因为 @Stateless 注释。在 EJB 3.0 中,默认 transaction attribute对于所有 EJB 3.0 应用程序是 REQUIRED .

如果您不希望这样,您可以使用以下方法向无状态 session Bean 类添加注释:

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@WebService(
...

我认为这将让您在应用程序的较低级别执行事务逻辑,正如您所描述的,并且不会启动全局事务。

关于java - jax-ws 服务中的 "Operation Connection.commit is not allowed during a global transaction",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29311455/

相关文章:

java - 在运行时评估一系列 boolean 条件是否有效

java - 如何在不使用任何第三方工具的情况下通过 Java 代码将我的 Java 代码转换为 EXE?

c++ - 使用 WWSAPI 客户端和 WCF 服务的回调实现

java - 如何在javax.ws.rs.client中为客户端重用java中的tcp session

java - JPA 2 - 如何使用 Spring Data JPA 构建具有主键也是外键的实体?

java - 如何在 spring webapp 中初始化 Velocity DateTool?

java - 在跳转到 JavaEE 之前我应该​​做更多的 JavaSE 吗?

angular - 如何在 Angular 4 中使用 post 请求 API 发送多个文件

java - 第二次调用方法后,Hibernate Session 在 Spring 事务中关闭

java - 使用 ScrollableResults 和 hibernate