首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Spring中使用JBossTS (Narayana)

如何在Spring中使用JBossTS (Narayana)
EN

Stack Overflow用户
提问于 2016-09-24 06:13:40
回答 1查看 1.8K关注 0票数 0

我正在调查使用Spring的JTA事务管理器的使用情况。我已经成功地配置了Atomikos和Bitronix,并且正在尝试配置JBossTS (Arjuna/Narayana)。

我遵循了为Spring配置JBossTS的说明,并提出了以下配置:

代码语言:javascript
复制
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
  <property name="jpaProperties">
    <props>
      <prop key="hibernate.format_sql">true"</prop>
      <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
      <prop key="hibernate.id.new_generator_mappings">false</prop>
      <prop key="hibernate.transaction.jta.platform">org.hibernate.engine.transaction.jta.platform.internal.JBossStandAloneJtaPlatform</prop>
      <prop key="hibernate.use_sql_comments">true</prop>
    </props>
  </property>
  <property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
      <property name="databasePlatform" value="org.hibernate.dialect.H2Dialect"/>
      <property name="generateDdl" value="true"/>
      <property name="showSql" value="true"/>
    </bean>
  </property>
  <property name="jtaDataSource">
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="connectionProperties">
        <props>
          <prop key="dynamicClass">com.arjuna.ats.internal.jdbc.drivers.PropertyFileDynamicClass</prop>
          <prop key="password"></prop>
          <prop key="user">sa</prop>
        </props>
      </property>
      <property name="driverClassName" value="com.arjuna.ats.jdbc.TransactionalDriver"/>
      <property name="url" value="jdbc:arjuna:database.properties"/>
    </bean>
  </property>
  <property name="packagesToScan" value="org.example.domain"/>
</bean>

<bean class="org.springframework.transaction.jta.JtaTransactionManager" id="transactionManager">
  <property name="transactionManager">
    <bean class="com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple"/>
  </property>
  <property name="userTransaction">
    <bean class="com.arjuna.ats.jta.UserTransaction" factory-method="userTransaction"/>
  </property>
</bean>

<transaction:annotation-driven/>

但是,试图运行应用程序会引发以下错误:

代码语言:javascript
复制
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
Caused by: org.hibernate.exception.GenericJDBCException: Unable to open JDBC Connection for DDL execution
Caused by: java.sql.SQLException: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at com.arjuna.ats.internal.jdbc.IndirectRecoverableConnection.createDataSource(IndirectRecoverableConnection.java:361)
    at com.arjuna.ats.internal.jdbc.IndirectRecoverableConnection.<init>(IndirectRecoverableConnection.java:109)
    at com.arjuna.ats.internal.jdbc.ConnectionImple.<init>(ConnectionImple.java:107)
    at com.arjuna.ats.internal.jdbc.ConnectionManager.create(ConnectionManager.java:110)
    at com.arjuna.ats.jdbc.TransactionalDriver.connect(TransactionalDriver.java:87)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:153)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:144)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:196)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:159)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180)
    at org.hibernate.resource.transaction.backend.jta.internal.DdlTransactionIsolatorJtaImpl.prepare(DdlTransactionIsolatorJtaImpl.java:49)
    ... 60 more
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at com.arjuna.ats.internal.jdbc.IndirectRecoverableConnection.createDataSource(IndirectRecoverableConnection.java:346)

似乎没有任何关于JNDI是否必须运行JBossTS的文档,如果是,如何在不使用JavaEE容器的独立应用程序中配置JNDI。

如果需要完整的配置和源代码,则需要一个示例应用程序可在Github上找到。通过将Maven测试作为mvn test -D"spring.profiles.active=jbossts"运行就可以看出这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-08 15:56:00

  1. <prop key="dynamicClass">替换为<prop key="DYNAMIC_CLASS">
  2. 使用target/classes指定属性文件
  3. 使用H2文件数据库而不是内存

有关更多信息,您可以看到narayana.io

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39673158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档