2017-08-03 84 views
0

我在写一个Spring Boot(Batch)应用程序,它应该以特定的退出代码退出。当数据库无法连接时,需要返回退出代码。为什么我的自定义DataSource getConnection()抛出“SQLException:URL不能为空”?

我的方法是通过明确创建DataSource bean尽早处理此异常,调用getConnection()并捕获并抛出实现ExitCodeGenerator的自定义异常。配置如下:

@Configuration 
@EnableBatchProcessing 
public class BatchConfiguration { 
... 
@Bean 
@Primary 
@ConfigurationProperties("spring.datasource") 
public DataSourceProperties dataSourceProps() { 
    return new DataSourceProperties(); 
} 

@Bean 
@ConfigurationProperties("spring.datasource") 
public DataSource customDataSource(DataSourceProperties props) { 

    DataSource ds = props.initializeDataSourceBuilder().create().build(); 

    try { 
     ds.getConnection(); 

    } catch (SQLException e) { 
     throw new DBConnectionException(e); // implements ExitCodeGenerator interface 
    } 

    return ds; 
} 
... 
} 

我想重用尽可能多的春天开机自动配置成为可能,这就是为什么我使用@ConfigurationProperties。我不知道这是否是要走的路。

DataSourceProperties.getUrl()调用返回的配置URL(从我的属性文件):

spring.datasource.url=jdbc:oracle:.... 

但为什么春天引导抛出此异常,当我打电话DataSource.getConnection()

java.sql.SQLException: The url cannot be null 
at java.sql.DriverManager.getConnection(DriverManager.java:649) ~[?:1.8.0_141] 
at java.sql.DriverManager.getConnection(DriverManager.java:208) ~[?:1.8.0_141] 
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:308) ~[tomcat-jdbc-8.5.15.jar:?] 
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203) ~[tomcat-jdbc-8.5.15.jar:?] 
at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:735) ~[tomcat-jdbc-8.5.15.jar:?] 
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:667) ~[tomcat-jdbc-8.5.15.jar:?] 
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:482) [tomcat-jdbc-8.5.15.jar:?] 
at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154) [tomcat-jdbc-8.5.15.jar:?] 
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118) [tomcat-jdbc-8.5.15.jar:?] 
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107) [tomcat-jdbc-8.5.15.jar:?] 
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131) [tomcat-jdbc-8.5.15.jar:?] 
at com.foo.bar.BatchConfiguration.customDataSource(BatchConfiguration.java:xxx) [main/:?] 
... 

或者你知道一些更清洁的方式来处理这种情况?

感谢

编辑:春天启动的版本是1.5.4

+0

您是否试图引入杀死应用程序的致命错误? – ryan2049

+0

我尽可能早地检测到失败的数据库连接。 – hellectronic

回答

2

的错误是微妙而在于行

DataSource ds = props.initializeDataSourceBuilder().create().build(); 

create()创建一个新的DataSourceBuilder并删除预配置的性能。

props.initializeDataSourceBuilder()已经返回一个DataSourceBuilder所有的属性(网址,用户名等)设置。所以你只需要添加新的属性或直接build()它。因此,解决办法是消除create()

DataSource ds = props.initializeDataSourceBuilder().build(); 

在这方面,dataSourceProps()方法绿豆可以去除过多。

0

它看起来像你不设置您的数据源的任意值。

props.initializeDataSourceBuilder().create().build();不会将您的属性值设置为您的数据源。它只是创建并构建一个。

尝试使用静态DataSourceBuilder手动设置您的值。你会从你的dataSourceProps豆获取值这样的:

@Configuration 
@EnableBatchProcessing 
public class BatchConfiguration { 
... 
@Bean 
@Primary 
@ConfigurationProperties("spring.datasource") 
public DataSourceProperties dataSourceProps() { 
    return new DataSourceProperties(); 
} 

@Bean 
@ConfigurationProperties("spring.datasource") 
public DataSource customDataSource(DataSourceProperties props) { 

     DataSource ds = DataSourceBuilder.create() 
      .driverClassName(dataSourceProps().getDriverClassName()) 
      .url(dataSourceProps().getUrl()) 
      .username(dataSourceProps().getUsername()) 
      .password(dataSourceProps().getPassword()) 
      .build(); 

    try { 
     ds.getConnection(); 

    } catch (SQLException e) { 
     throw new DBConnectionException(e); // implements ExitCodeGenerator interface 
    } 

    return ds; 
} 
... 
} 
相关问题