Я понимаю, что это то, что будет считаться дублирующей темой, но я не выполнил рекомендуемые шаги в других темах этого же характера без успеха.Не найдено подходящего драйвера для jdbc: sqlserver
Я использую Ггц 3.6.4 с
- Grails 2.3.0
- jdk1.7.0_80
- Groovy компилятор уровень 2,3
- Microsoft SQL Server 2012
I имеют grails-приложение, которое аутентифицирует пользователей, регистрирующихся на сервере LDAP с Apache Shiro, и у меня есть следующий код (в 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 в/приложении/Lib/
- добавлено вручную/приложении/Библиотека/пути к классам (через .classpath)
- Добавлено sqljdbc4.jar путь к классам через
Properties
>Java Build Path
>Add JARs
Я пробовал эти вариации с sqljdbc4.jar, sqljdbc.jar и sqlserverjdbc.jar и каждый комбо его.
Я в основном застрял. Ни одна из исправлений, которые я прочитал здесь, или где-либо еще, не разрешил мою ошибку. Любая помощь будет принята с благодарностью!
Edit 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)
Является ли это шагом вперед, назад, или мы бежим на месте?
Edit 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)
}
}
и я успешно обращались мой DB с модифицировано ShiroUser.groovy
file
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 ");'. –
Публикация обновленных ошибок с вашими изменениями – mjswartz
В соответствии с сообщением об ошибке файл jar драйвера, конечно, не находится в пути к классам. Как вы сказали, файл jar драйвера находится в папке app/lib, я бы рекомендовал запустить «grails run-app» и пропустить среду IDE. – defectus