【发布时间】:2015-07-21 20:16:34
【问题描述】:
我知道这会被视为重复主题,但我已按照其他相同性质主题中的推荐步骤进行操作,但没有成功。
我正在使用 GGTS 3.6.4 和
- Grails 2.3.0
- jdk1.7.0_80
- Groovy 编译器级别 2.3
- Microsoft SQL Server 2012
我有一个 grails 应用程序,它使用 Apache Shiro 对登录到 LDAP 服务器的用户进行身份验证,我有以下代码(在 Shiro 生成的 AuthController.groovy 中)尝试在会话中存储来自外部数据库的一些信息。 (注意:关于用户名、密码和数据库名称,出于隐私原因,我在这里全部更改了)
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)
- 通过
Properties>Java Build Path>Add JARs将sqljdbc4.jar 添加到类路径中
我已经使用 sqljdbc4.jar、sqljdbc.jar 和 sqlserverjdbc.jar 以及它们的每个组合尝试了这些变体。
我基本上被卡住了。我在这里或其他地方读到的所有修复都不能解决我的错误。任何帮助将不胜感激!
编辑 1:在 newInstance 调用上方添加 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver") 会产生以下错误:
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 是我现在要走的路。
【问题讨论】:
-
我不知道 Groovy,具体来说,但您需要实际加载 Java 中的类。试试
Class.forName("package.name.for.DriverClassName");。 -
在您的更改中发布更新的错误
-
根据错误消息,驱动程序 jar 文件肯定不在类路径中。正如您所说,驱动程序 jar 文件位于 app/lib 文件夹中,我建议运行
grails run-app并跳过 IDE。 -
从命令行运行并没有改变任何东西
-
有时 groovy(对我来说是 groovy 控制台)可以加载驱动程序(在有意义的加载类中)但不能作为 jdbc 驱动程序运行stackoverflow.com/questions/32494835/… 在一种方式(加载)是可以的,在其他方面不是,@987654341 @ 生效
标签: sql-server grails jdbc groovy ggts