2016-11-22 1 views
1

У меня есть следующий фрагмент кода до сих пор:sql2o с SQLite в Java NoInitialContextException

Sql2o sql2o = new Sql2o("jdbc:sqlite:test.db"); 

try (Connection connection = sql2o.open()) { 
    for (Column column : connection.createQuery("SELECT * FROM sometable").executeAndFetchTable().columns()) 
     System.out.println(column.toString()); 
} 

Я использую эти зависимости:

<dependency> 
    <groupId>org.sql2o</groupId> 
    <artifactId>sql2o</artifactId> 
    <version>1.5.4</version> 
</dependency> 
<dependency> 
    <groupId>org.xerial</groupId> 
    <artifactId>sqlite-jdbc</artifactId> 
    <version>3.15.1</version> 
</dependency> 

Однако, это бросает NoInitialContextException при выполнении. Трассировка стека:

Exception in thread "main" java.lang.RuntimeException: 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 org.sql2o.JndiDataSource.getJndiDatasource(JndiDataSource.java:27) 
     at org.sql2o.Sql2o.<init>(Sql2o.java:36) 
     at me.mypackage.sqlitetest.SqliteTest.main(SqliteTest.java:11) 
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(Unknown Source) 
     at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source) 
     at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source) 
     at javax.naming.InitialContext.lookup(Unknown Source) 
     at org.sql2o.JndiDataSource.getJndiDatasource(JndiDataSource.java:24) 
     ... 2 more 

Как решить эту проблему?

ответ

3

Попробуйте заменить эту строку

Sql2o sql2o = new Sql2o("jdbc:sqlite:test.db"); 

с

Sql2o sql2o = new Sql2o("jdbc:sqlite:test.db", null, null); 

Sql2o класс имеет конструктор, который принимает только одну строку, однако, что одна строка является именем JNDI, а не соединение URL JDBC , Существует еще один конструктор, который принимает три строки, для URL-адреса подключения, имени пользователя и пароля. SQLite не использует имя пользователя и пароль, поэтому мы можем указать значения null для них обоих.

+0

Спасибо! Я, должно быть, пропустил это из примера MySQL, потому что думал, что он будет работать без учетных данных, поскольку в этом нет необходимости ... черт побери. – linkD