2013-12-16 5 views
5

Я прохожу через Поваренную книгу разработки приложений для лифтов Гилберто Т. Гарсиа младшего и столкнулся с проблемой, которую я не могу решить. Я скопировал исходный код Chap06-map-table, и я пытаюсь изменить его для работы с моей базой данных IBM i (iSeries, AS/400, i5). Мне удалось заставить его работать с первым типом подключения, используя Squeryl Record. Тем не менее, я не могу представить, как это можно использовать с использованием источника данных JNDI. Я потратил пару дней на поиск в Интернете примеров настройки и не нашел хорошего примера, связанного с подключением базы данных DB/400. Ниже приведена ошибка, которую я получаю, когда пытаюсь запустить контейнер и код, который я модифицировал, чтобы заставить его работать. Любая помощь будет оценена по достоинству. Кажется, есть какой-то выбор для класса источника данных из jt4oo.jar (jtOpen), и я не уверен, какой из них лучше всего использовать, или, возможно, есть другой. Я пробовал это с каждым из трех, и я предполагаю, что первый правильный.Искатель не может установить соединение. Jetty, Lift/Scala, iSeries DB2/400

com.ibm.as400.access.AS400JDBCManagedConnectionPoolDataSource 
com.ibm.as400.access.AS400JDBCConnectionPoolDataSource 
com.ibm.as400.access.AS400JDBCDataSource 

Спасибо. Боб

Это начало ошибки:

> container:start 
[info] jetty-8.0.4.v20111024 
[info] No Transaction manager found - if your webapp requires one, please config 
ure one. 
[info] NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet 
[info] started o.e.j.w.WebAppContext{/,[file:/C:/Users/Bob/Lift26Projects/scala_ 
210/chap06-map-table/src/main/webapp/]} 
[info] started o.e.j.w.WebAppContext{/,[file:/C:/Users/Bob/Lift26Projects/scala_ 
210/chap06-map-table/src/main/webapp/]} 
18:21:47.062 [pool-7-thread-1] ERROR n.liftweb.http.provider.HTTPProvider - Fail 
ed to Boot! Your application may not run properly 
java.sql.SQLException: The application requester cannot establish the connection 
. ("jdbc:as400://www.busapp.com;libraries=PLAY2TEST";naming=system;errors=full;) 
     at com.ibm.as400.access.JDError.throwSQLException(JDError.java:524) ~[jt 
400-6.7.jar:JTOpen 6.7] 
     at com.ibm.as400.access.AS400JDBCConnection.setProperties(AS400JDBCConne 
ction.java:3142) ~[jt400-6.7.jar:JTOpen 6.7] 
     at com.ibm.as400.access.AS400JDBCManagedDataSource.createPhysicalConnect... 

Мои Build.sbt Файл:

name := "Lift 2.5 starter template" 
version := "0.0.1" 
organization := "net.liftweb" 
scalaVersion := "2.10.0" 
resolvers ++= Seq("snapshots" at "http://oss.sonatype.org/content/repositories/snapshots", 
      "staging"   at "http://oss.sonatype.org/content/repositories/staging", 
      "releases"  at "http://oss.sonatype.org/content/repositories/releases" 
      ) 
seq(com.github.siasia.WebPlugin.webSettings :_*) 
unmanagedResourceDirectories in Test <+= (baseDirectory) { _/"src/main/webapp" } 
scalacOptions ++= Seq("-deprecation", "-unchecked") 
env in Compile := Some(file("./src/main/webapp/WEB-INF/jetty-env.xml") asFile) 
libraryDependencies ++= { 
    val liftVersion = "2.5" 
    Seq(
    "net.liftweb"  %% "lift-webkit"  % liftVersion  % "compile", 
    "net.liftmodules" %% "lift-jquery-module_2.5" % "2.3", 
    "org.eclipse.jetty"  % "jetty-webapp"  % "8.0.4.v20111024" % "container", 
    "org.eclipse.jetty"  % "jetty-plus"   % "8.0.4.v20111024" % "container", 
    "ch.qos.logback" % "logback-classic"  % "1.0.6", 
    "org.specs2"  %% "specs2"    % "1.14"   % "test", 
    "net.liftweb"  %% "lift-squeryl-record" % liftVersion % "compile", 
    "net.sf.jt400" % "jt400"  % "6.7", 
    "org.liquibase" % "liquibase-maven-plugin" % "3.0.2" 
) 
} 

Это мой boot.scala файл:

package bootstrap.liftweb 

    import _root_.liquibase.database.DatabaseFactory 
    import _root_.liquibase.database.jvm.JdbcConnection 
    import _root_.liquibase.exception.DatabaseException 
    import _root_.liquibase.Liquibase 
    import _root_.liquibase.resource.FileSystemResourceAccessor 
    import net.liftweb._ 
    import util._ 
    import Helpers._ 
    import common._ 
    import http._ 
    import sitemap._ 
    import Loc._ 
    import net.liftmodules.JQueryModule 
    import net.liftweb.http.js.jquery._ 
    import net.liftweb.squerylrecord.SquerylRecord 
    import org.squeryl.Session 
    import java.sql.{SQLException, DriverManager} 
    import org.squeryl.adapters.DB2Adapter 
    import javax.naming.InitialContext 
    import javax.sql.DataSource 
    import code.model.LiftBookSchema 
    /** 
    * A class that's instantiated early and run. It allows the application 
    * to modify lift's environment 
    */ 
    class Boot { 
    def runChangeLog(ds: DataSource) { 
    val connection = ds.getConnection 
     try { 
     val database = DatabaseFactory.getInstance(). 
     findCorrectDatabaseImplementation(new JdbcConnection(connection)) 
     val liquibase = new Liquibase(
     "database/changelog/db.changelog-master.xml", 
     new FileSystemResourceAccessor(), 
     database 
     ) 

     liquibase.update(null) 
     } catch { 
     case e: SQLException => { 
     connection.rollback() 
     throw new DatabaseException(e) 
     } 
    } 
    } 
    def boot { 

    // where to search snippet 
    LiftRules.addToPackages("code") 

    prepareDb() 


    // Build SiteMap 
    val entries = List(
     Menu.i("Home")/"index", // the simple way to declare a menu 

     // more complex because this menu allows anything in the 
     // /static path to be visible 
     Menu(Loc("Static", Link(List("static"), true, "/static/index"), 
     "Static Content"))) 

    // set the sitemap. Note if you don't want access control for 
    // each page, just comment this line out. 
    LiftRules.setSiteMap(SiteMap(entries: _*)) 

    //Show the spinny image when an Ajax call starts 
    LiftRules.ajaxStart = 
     Full(() => LiftRules.jsArtifacts.show("ajax-loader").cmd) 

    // Make the spinny image go away when it ends 
    LiftRules.ajaxEnd = 
     Full(() => LiftRules.jsArtifacts.hide("ajax-loader").cmd) 

    // Force the request to be UTF-8 
    LiftRules.early.append(_.setCharacterEncoding("UTF-8")) 

    // Use HTML5 for rendering 
    LiftRules.htmlProperties.default.set((r: Req) => 
     new Html5Properties(r.userAgent)) 

    //Init the jQuery module, see http://liftweb.net/jquery for more information. 
    LiftRules.jsArtifacts = JQueryArtifacts 
    JQueryModule.InitParam.JQuery = JQueryModule.JQuery172 
    JQueryModule.init() 

    } 

    def prepareDb() { 

    Class.forName("com.ibm.as400.access.AS400JDBCManagedConnectionPoolDataSource") 

    val ds = new InitialContext().lookup("java:/comp/env/jdbc/dsliftbook").asInstanceOf[DataSource] 

    runChangeLog(ds) 

    SquerylRecord.initWithSquerylSession(
     Session.create(
     ds.getConnection, 
     new DB2Adapter) 
    ) 
    } 


} 

Это мой Пристань-ENV-XML File

<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> 
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <New id="dsliftbook" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>jdbc/dsliftbook</Arg> 
    <Arg> 
     <New class="com.ibm.as400.access.AS400JDBCManagedConnectionPoolDataSource"> 
     <Set name="serverName">"jdbc:as400://www.[server].com;libraries=PLAY2TEST";naming=system;errors=full;</Set> 
     <Set name="user">[user]</Set> 
     <Set name="password">[password]</Set> 
     </New> 
    </Arg> 
    </New> 
</Configure> 
+2

Вы получаете в SQLException от драйвера JDBC говорит вам, что он не может подключиться к базе данных. Убедитесь, что ваш URL, имя пользователя и пароль верны. Если они выглядят правильно, попробуйте подключиться к серверу с компьютера, на котором запущено приложение, без использования java и посмотреть, удастся ли это сделать. Вы также можете найти дополнительную информацию о том, почему db отказывается от соединений в журналах db. –

+0

Котировка кажется неуместной в вашей базе данных uri: '' jdbc: as400: // www. [Server] .com; libraries = PLAY2TEST "; naming = system; errors = full;' должно быть '" jdbc: as400: // www. [server] .com; libraries = PLAY2TEST; naming = system; errors = full; "' – jamesallman

+0

Я исправил цитату, фактически удалил их полностью. Все еще не работает. Для подключения без источника данных выполняется следующее. 'Импорт org.squeryl.Session импорт org.squeryl.adapters.DB2Adapter импорт net.liftweb.squerylrecord.SquerylRecord Class.forName ("com.ibm.as400.access.AS400JDBCDriver") Защиту соединение = DriverManager. getConnection ("jdbc: as400: // www. {server] .com /; naming = 1; libraries = PLAY2TEST;", "[user]", "[password]") SquerylRecord.initWithSquerylSession (Session.create (Session.create (Session.create) соединение, новый DB2Adapter)) ' –

ответ

1

Хорошо, что мне удалось подключиться. Одной из проблем были кавычки в файле jetty-env-xml. И имя пользователя/пароль, который я использовал, по-видимому, не отвечал требованиям, необходимым для выполнения этой работы. Я не уверен, почему, поскольку это тот же идентификатор/пароль, который я использую для всей моей разработки iSeries. Поэтому пока я еще один профиль пользователя с полномочным офицером службы безопасности, пока не смогу выяснить, что происходит или какие полномочия требуются.

Как только я получил подписку, я не смог установить список библиотек для пользователя, и это привело к сбою SQL. Он искал имя библиотеки, которое было таким же, как идентификатор пользователя. В настоящее время я столкнулся с этой проблемой, создав новую библиотеку с именем, идентичным идентификатору пользователя.

Еще одна проблема заключается в том, что даже если я поставляю как ID, так и пароль, мне будет предложено ввести ID/пароль, прежде чем он подключится. Идентификатор и URL-адрес заполняются, но пароль всегда нужно повторно вводить.

Я включил текущий источник файла jetty-env-xml и файл boot.scala. Надеюсь, это может помочь другим.

Спасибо Дэйву и Джеймсу за помощь!

Боб

загрузки.Скала:

package bootstrap.liftweb 

// import _root_.liquibase.database.DatabaseFactory 
// import _root_.liquibase.database.jvm.JdbcConnection 
// import _root_.liquibase.exception.DatabaseException 
// import _root_.liquibase.Liquibase 
// import _root_.liquibase.resource.FileSystemResourceAccessor 
import net.liftweb._ 
import util._ 
import Helpers._ 

import common._ 
import http._ 
import sitemap._ 
import Loc._ 
import net.liftmodules.JQueryModule 
import net.liftweb.http.js.jquery._ 
import net.liftweb.squerylrecord.SquerylRecord 
import org.squeryl.Session 
import java.sql.{SQLException, DriverManager} 
import org.squeryl.adapters.DB2Adapter 
import javax.naming.InitialContext 
import javax.sql.DataSource 
import code.model.LiftBookSchema 
import com.ibm.as400.access.AS400JDBCManagedConnectionPoolDataSource 



/** 
* A class that's instantiated early and run. It allows the application 
* to modify lift's environment 
*/ 
class Boot { 
    // def runChangeLog(ds: DataSource) { 
    // val connection = ds.getConnection 

    // try { 
    //  val database = DatabaseFactory.getInstance(). 
    //  findCorrectDatabaseImplementation(new JdbcConnection(connection)) 

    //  val liquibase = new Liquibase(
    //  "database/changelog/db.changelog-master.xml", 
    //  new FileSystemResourceAccessor(), 
    //  database 
    // ) 

    //  liquibase.update(null) 
    // } catch { 
    //  case e: SQLException => { 
    //  connection.rollback() 
    //  throw new DatabaseException(e) 
    //  } 
    // } 
    // } 

    def boot { 

    // where to search snippet 
    LiftRules.addToPackages("code") 

    prepareDb() 


    // Build SiteMap 
    val entries = List(
     Menu.i("Home")/"index", // the simple way to declare a menu 

     // more complex because this menu allows anything in the 
     // /static path to be visible 
     Menu(Loc("Static", Link(List("static"), true, "/static/index"), 
     "Static Content"))) 

    // set the sitemap. Note if you don't want access control for 
    // each page, just comment this line out. 
    LiftRules.setSiteMap(SiteMap(entries: _*)) 

    //Show the spinny image when an Ajax call starts 
    LiftRules.ajaxStart = 
     Full(() => LiftRules.jsArtifacts.show("ajax-loader").cmd) 

    // Make the spinny image go away when it ends 
    LiftRules.ajaxEnd = 
     Full(() => LiftRules.jsArtifacts.hide("ajax-loader").cmd) 

    // Force the request to be UTF-8 
    LiftRules.early.append(_.setCharacterEncoding("UTF-8")) 

    // Use HTML5 for rendering 
    LiftRules.htmlProperties.default.set((r: Req) => 
     new Html5Properties(r.userAgent)) 

    //Init the jQuery module, see http://liftweb.net/jquery for more information. 
    LiftRules.jsArtifacts = JQueryArtifacts 
    JQueryModule.InitParam.JQuery = JQueryModule.JQuery172 
    JQueryModule.init() 

    } 

    def prepareDb() { 

    Class.forName("com.ibm.as400.access.AS400JDBCManagedConnectionPoolDataSource") 

    val ds = new InitialContext().lookup("java:/comp/env/jdbc/dsliftbook").asInstanceOf[DataSource] 

    // runChangeLog(ds) 

    SquerylRecord.initWithSquerylSession(Session.create(ds.getConnection, new DB2Adapter) 
    ) 
    } 
} 

Пристань-ENV-XML

<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> 
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <New id="dsliftbook" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>jdbc/dsliftbook</Arg> 
    <Arg> 
     <New class="com.ibm.as400.access.AS400JDBCManagedConnectionPoolDataSource"> 
     <Set name="serverName">www.[server].com</Set> 
     <Set name="user">DBUSER</Set> 
     <Set name="password">DBUSER</Set> 
     </New> 
    </Arg> 
    </New> 
</Configure> 
+0

Я также смог войти в систему как QUSER. Кажется, что-то другое в моем профиле, что мешало мне использовать его для входа. –