0

これが重複したトピックと見なされるものであることは認識していますが、同じ性質の他のトピックで推奨されている手順に従いましたが、成功しませんでした.

私はGGTS 3.6.4を使用しています

  • グレイル 2.3.0
  • jdk1.7.0_80
  • Groovy コンパイラ レベル 2.3
  • マイクロソフト SQL Server 2012

私は Apache Shiro を使用して LDAP サーバーに対してログインするユーザーを認証する grails-app を持っておりAuthController.groovy、外部データベースからの情報をセッションに保存しようとする次のコード (Shiro によって生成された ) があります。(注: ユーザー名、パスワード、およびデータベース名に関しては、プライバシー上の理由から、ここではすべて変更しました)

def signIn = {
    Subject subject = SecurityUtils.getSubject();
    String lowerCaseUserName=params.username.toLowerCase();
    def authToken = new UsernamePasswordToken(lowerCaseUserName, params.password)

    // Support for "remember me"
    if (params.rememberMe) {
        authToken.rememberMe = true
    }

    try{
        subject.login(authToken)

        if (subject.isAuthenticated()) 
        {
            session.username = lowerCaseUserName

            // Attempting to get employee id from MS SQL
            Sql Database = Sql.newInstance(
                'jdbc:sqlserver://myserver;DatabaseName=mydatabase',
                'user',
                'password',
                'com.microsoft.sqlserver.jdbc.SQLServerDriver'
            );
            Database.eachRow('select empid from table_name where username=${session.username}') { row ->
                session.empid = row.empid
            }
            Database.close();   

            def targetUri = params.targetUri ?: "/home"
            log.info "Redirecting to '${targetUri}'."
            redirect(uri: targetUri)
        }
    }
    ...
}

ただし、次のエラーが表示されます

SQLException occurred when processing request: [POST] /app/auth/signIn - parameters:
username: user
_rememberMe: 
targetUri: 
password: ***
No suitable driver found for jdbc:sqlserver://myserver;DatabaseName=mydatabase. Stacktrace follows:
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://myserver;DatabaseName=mydatabase
at java.sql.DriverManager.getConnection(DriverManager.java:596)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at app.AuthController$_closure3.doCall(AuthController.groovy:45)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:200)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

次のことを試しましたが、成功しませんでした:

  • /app/lib/ に sqljdbc4.jar を追加
  • /app/lib/ を手動でクラスパスに追加 (.classpath 経由)
  • Properties> Java Build Path>経由でクラスパスに sqljdbc4.jar を追加しました。Add JARs

これらのバリエーションを、sqljdbc4.jar、sqljdbc.jar、sqlserverjdbc.jar、およびそれらのすべての組み合わせで試しました。

私は基本的に立ち往生しています。ここまたは他の場所で読んだ修正のどれも、私のエラーを解決しません。どんな助けでも大歓迎です!

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")編集 1: 呼び出しの上に追加newInstanceすると、次のエラーが発生します。

ClassNotFoundException occurred when processing request: [POST] /app/auth/signIn - parameters:
username: user
_rememberMe: 
targetUri: 
password: ***
com.microsoft.sqlserver.jdbc.SQLServerDriver. Stacktrace follows:
java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName(Class.java:195)
at isec.AuthController$_closure3.doCall(AuthController.groovy:45)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:200)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

これは前進ですか、後退ですか、それとも順調に​​進んでいますか?

編集2:私がしなければならなかったのは、DataSource.groovyこれに変更することでした

dataSource {
    pooled = true
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = false
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3
    //cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4
}

// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "validate"
            url = "jdbc:sqlserver://myserver:1433;databaseName=mydatabase;"
            driverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
            username = "myusername"
            password = "mypassword"
        }
    }
....
}

AuthController.groovyデータアクセスをに変更しました

    try{
        subject.login(authToken)
        if (subject.isAuthenticated()) 
        {
            ShiroUser currentUser = new ShiroUser()

            def targetUri = params.targetUri ?: "/home"
            log.info "Redirecting to '${targetUri}'."
            redirect(uri: targetUri)
        }
    }

ShiroUser.groovyそして、変更されたファイルでDBに正常にアクセスしました

class ShiroUser {

    static hasMany = [ roles: ShiroRole, permissions: String ]

    User_Data userData;

    static constraints = {
    }

    def getUsername() {
        return userData.username
    }
}

User_Data.groovyを含む新しいドメインクラスはどこですか

class User_Data {

    static mapping = {
        table "mytablename"
    }
    ...
}

だから今、私はメソッドをいじっています!なぜJDBCがうまくいかなかったのかはわかりませんが、GORMは私が今取っている道です.

4

1 に答える 1

0

既に行った /app/lib/ に sqljdbc4.jar を追加する必要があります。

BuildConfig.groovy にデータベース接続を追加してみましたか

dataSource {
        dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
        driverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
        dialect = "org.hibernate.dialect.SQLServerDialect"
        url = "jdbc:sqlserver://localhost:1433;databaseName=dbName"
        username = "sa"
        password = ""
    }

また、SQL サーバーがポート 1433 での接続を受け入れるように構成されていることを確認してください。デフォルトでは無効になっています。

于 2015-07-22T14:53:45.147 に答える