【问题标题】:Spring Boot PersistenceSpring Boot 持久性
【发布时间】:2017-06-11 21:52:48
【问题描述】:

SpringBoot 如何从 application.properties 文件中获取 DataSource 配置。

下面的配置会保留实体吗?

Module 1 包含 Config 文件和 application.properties 文件

模块 2 包含存储库和服务文件

到目前为止,我还没有配置任何带有@Repository 注释的文件。

contextRepository.saveAndFlush(test);

Spring Boot 配置类如下:

@EnableSwagger2
@SpringBootApplication
@ComponentScan(basePackages={"ch.service"})
public class MyCodeConfiguration extends SpringBootServletInitializer {

//Module1
package ch.service.config;

@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource realDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean
@ConditionalOnMissingBean(PlatformTransactionManager.class)
public DataSourceTransactionManager transactionManager() {
    DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(realDataSource());
    return transactionManager;
}


}

下面的服务类。

 //Module2
 package ch.service.config;

@Service
public class CodeServiceImpl implements CodeService {

@Autowired
private ContextRepository contextRepository;


@Transactional
public void persistValues(Testbean test){
      contextRepository.saveAndFlush(test);
  }

}

下面的存储库类

 //Module2
 package ch.service.config.dao;

public interface ContextRepository extends JpaRepository<MyContext, Long> {

}

以下错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method transactionManager in org.springframework.boot.autoconfigure.transaction.jta.BitronixJtaConfiguration required a bean of type 'javax.transaction.TransactionManager' that could not be found.
    - Bean method 'narayanaTransactionManager' not loaded because @ConditionalOnClass did not find required classes 'com.arjuna.ats.jta.UserTransaction', 'org.jboss.tm.XAResourceRecoveryRegistry'

行动:

Consider revisiting the conditions above or defining a bean of type 'javax.transaction.TransactionManager' in your configuration.

【问题讨论】:

  • Config 类中的包声明是怎么回事?

标签: spring spring-boot spring-data


【解决方案1】:

当您使用 Spring Boot 时,您可以使用 application.properties 中的以下预定义数据库配置键来自动配置数据库。

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

您的其余代码看起来不错。它应该持久化数据

要修复你得到的异常,你必须在你的配置中有一个事务管理器。

@Bean
public PlatformTransactionManager transactionManager() {
    return new JpaTransactionManager();
}

参考:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html

【讨论】:

  • 感谢 Avinash 的回复..我想到的 2 个问题.. contextRepository 如何能够在这里持久存在,因为没有明确的数据库配置? .. MyCodeConfiguration 中配置的 Datasource 是否隐式连接到 contextRepository ..
  • 一旦你定义了上述属性,数据源就会自动配置,这是 Spring Boot 的一个特性。对于这些属性,您无需在 MyCodeConfiguration 类中执行任何操作。
  • 是否可以在不以上述方式定义Bean的情况下定义TransactionManager..我的意思是通过application.properties文件配置..
【解决方案2】:

如果您的项目有数据启动器,例如:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

如果您希望它连接到非嵌入式数据库,则必须在 application.properties 中使用 spring.datasource.* 键设置配置

DataSourceProperties 将获取配置

所有的spring boot key都是here

【讨论】:

  • 我在我的 pom 中有这种依赖 .. 但是得到错误:原因:org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.boot.autoconfigure.orm 的 bean 时出错.jpa.HibernateJpaAutoConfiguration':
  • 能否提供完整的日志?
  • 我已将错误粘贴到我的帖子中。由于长度限制,我无法在此处发帖。
猜你喜欢
  • 1970-01-01
  • 2014-01-17
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
相关资源
最近更新 更多