sql-server - 找不到适用于jdbc:sqlserver的驱动程序

标签 sql-server grails jdbc groovy ggts

我意识到这是一个重复的主题,但是在其他相同主题的主题中,我遵循了建议的步骤,但没有成功。

我正在使用GGTS 3.6.4

  • Grails 2.3.0
  • jdk1.7.0_80
  • Groovy编译器级别2.3
  • Microsoft SQL Server 2012年

  • 我有一个grails-app,它使用Apache Shiro对通过LDAP服务器登录的用户进行身份验证,并且我有以下代码(在Shiro生成的AuthController.groovy中)尝试在 session 中存储来自外部数据库的某些信息。 (注意:关于用户名,密码和数据库名称,出于隐私原因,我在此处更改了所有名称)
    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)
    

    我尝试了以下方法,但均未成功:
  • 将sqljdbc4.jar添加到/ app / lib /
  • 手动将/ app / lib /添加到classpath(通过.classpath)
  • 通过Properties> Java Build Path> Add JARs
  • 将sqljdbc4.jar添加到类路径

    我已经使用sqljdbc4.jar,sqljdbc.jar和sqlserverjdbc.jar及其所有组合尝试了这些变体。

    我基本上卡住了。我在这里或其他地方读过的所有修复程序都无法解决我的错误。任何帮助将不胜感激!

    编辑1:在Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")调用上方添加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文件成功访问了我的数据库
    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是我现在要走的路。

    最佳答案

    您肯定需要将sqljdbc4.jar添加到/ app / lib /中。

    您是否尝试过将数据库连接添加到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 Server配置为接受端口1433上的连接。默认情况下它被禁用。

    关于sql-server - 找不到适用于jdbc:sqlserver的驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31548797/

    相关文章:

    java - 向 MySQL 数据库中插入变量

    java - DBUtils - 使用 ResultSetHandler

    sql-server - 如何强制 SQL Server 返回空 JSON 数组

    c# - SQL Server错误: 50 when trying to add .mdf file to App_Data

    sql - 如何从没有 id 的表中删除重复(重复)记录和行

    grails - Grails中的外部用户域

    java - 如何使用 java.util.logging 记录 JDBC 数据库查询?

    sql查询统计重复项

    Grails 2抽象域继承问题

    tomcat - 在 Tomcat 中杀死守护线程的方法,应用程序无法启动 - 你如何解决这个问题?