当前位置: 首页 > 知识库问答 >
问题:

为什么第一个(而且只有第一个!)访问Spring数据存储库查找器是否总是回滚我的EJB事务?

车辰龙
2023-03-14

我的申请中有一个奇怪的现象。

我在一个本地无状态EJB中,希望调用另一个本地无状态EJB,这将导致以下异常:

javax.ejb.TransactionRolledbackLocalException: Client's transaction aborted

当我研究这个问题的时候,我发现通常原因是在尝试调用第二个(内部)EJB之前,第一个EJB内部的代码中存在运行时异常。

显然,即使捕获并处理了运行时异常,它的存在也足以将事务标记为回滚。到目前为止,这是可以理解的。

问题是我不知道相关代码中有任何运行时异常。但我能够找到导致这种情况的一行代码,这是对Spring数据存储库查找器的访问,如下所示:

@Inject
CompanyRepository companyRepo;

Company company = companyRepo.findByName(inputVO.getCompanyName());

我有几个存储库,不管我调用哪个存储库,它们都会导致这种效果。

但是,仅在重新部署应用程序后的第一次调用期间。之后,一切正常,直到我重新部署应用程序或重新启动Payara服务器。

哦,顺便说一下,对finder-method的调用总是返回一个有效的结果,即使在第一次调用中也没有“可见”异常。

我假设Spring数据代码中存在一些运行时异常,这些异常是经过修补和处理的,因此对我来说是不可见的。也许是某种“惰性初始化”,在这种情况下,只有在异常表明以前没有异常之后,才会初始化东西?我不知道。。。这只是一种预感。

不管怎样,我很想知道是否有人知道如何解决这个问题?(在@PostConstruct中进行虚拟查找调用似乎有点“不优雅”)

或者也许有人知道这个问题的根源,以及如何一起避免它?

作为参考,我将包括我的applicationContext。下面是xml(但请记住,我不是在Spring容器中运行,而是在Payara服务器中运行。我只使用Spring框架中的Spring数据库):

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p" 
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xmlns:jpa="http://www.springframework.org/schema/data/jpa"
        xmlns:util="http://www.springframework.org/schema/util"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.1.xsd
            http://www.springframework.org/schema/jdbc 
            http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
            http://www.springframework.org/schema/data/jpa
            http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
            http://www.springframework.org/schema/util 
            http://www.springframework.org/schema/util/spring-util-3.1.xsd">

    <jpa:repositories base-package="de.otto.cccs.customerscoring.entities" />

    <tx:jta-transaction-manager />
    <tx:annotation-driven />

    <context:component-scan base-package="de.otto.cccs" />

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entityManagerFactory-ref="entityManagerFactory" />

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="jdbc/COR99TSDatasource" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="persistenceUnitName" value="default" />
        <property name="jpaVendorAdapter">
            <bean
                class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
                <property name="databasePlatform"
                    value="org.eclipse.persistence.platform.database.OraclePlatform" />
                <property name="showSql" value="true" />
            </bean>
        </property>
    </bean>

</beans>

共有1个答案

冯新知
2023-03-14

我还没有找到解决这个问题的方法,但因为它与另一个问题有关(CDI:注入单实例是可行的,但注入实例是可行的)

所以这不是一个理想的答案,我知道,但这就是我现在要做的。

 类似资料:
  • 简而言之,我试图创建一个简单的api,它将返回具有匹配ID的用户。我使用postman向使用Node.js和Express创建的本地主机发送请求。当我请求第一个用户时,它工作得很好,但当请求“john”时,它会抛出一个错误。我正在编写一门udemy课程的代码,但除了材料过时之外,我不知道问题是什么。错误为“错误[ERR_HTTP_HEADERS_SEND]:将标头发送到客户端后无法设置标头” nu

  • 本文向大家介绍为什么建议setState的第一个参数是callback而不是一个对象呢?相关面试题,主要包含被问及为什么建议setState的第一个参数是callback而不是一个对象呢?时的应答技巧和注意事项,需要的朋友参考一下 React 为了优化性能,有可能会将多个 setState() 调用合并为一次更新。 因为this.props和this.state 可能是异步更新的,你不能依赖他们的

  • 我试图在一个Jasper报告中显示多个表,我使用子报告来实现这个功能。但我一直在显示几个子报告。实际上,只显示其中一个(第一个)。 以下是我的主report.jrxml: 下面是subjectSubreport.jrxml: 这是printersSubreport.jrxml: 当我切换子报告时,第一个报告正确显示,另一个报告消失。在JasperSoft Studio中,一切都很好,当我将它们导出

  • 我正在为二和leetcode问题实现一个哈希映射。 映射的第一个数组创建一个散列数组作为“索引”,它是nums数组中每个元素的目标差异。然后,我对映射数组应用一个过滤器,以查看映射数组的2个元素是否包含在nums数组中,并返回这些元素的索引。 当索引被过滤到returnedArr中时,它似乎返回nums的第一个元素,而不是两个索引。[2] 返回之前的日志记录显示它正确地分别注册了索引0和1,而不是