Reputation: 295
context.GrailsContextLoaderListener Error initializing the application: Method on class [Domain Class(auth.Role)] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.
java.lang.IllegalStateException: Method on class [Domain Class(auth.Role)] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.
This exception is thrown at this line :
def existingRole = Role.findByAuthority(role) // Code Interrupts
Role.groovy
import org.bson.types.ObjectId
class Role {
// static mapWith = 'mongo' (For mongoDb we have plugin, so this is working)
static mapWith = 'none' //(Migrating MongoDB to postgreSql so changed mapWith to 'none')
ObjectId id
String authority
static constraints = {
authority blank: false, unique: true
}
}
UserService.groovy
@Transactional
class UserService {
def grailsApplication
/**
* Create Users with supplied roles
* @param usersAndRoles map of user:role
*
* @return
*/
def createUsers(def usersAndRoles) {
// [user:ROLE_USER, manager:ROLE_MANAGER, admin:ROLE_ADMIN]
// For supplied list of user:role, create user with role
usersAndRoles.each { key, value ->
def user = User.findByUsername(key)
if (!user) {
def fields = grailsApplication.config."${key}"
user = new User(username: fields.username,
password: fields.password,
email: fields.email,
passwordExpired: true).save(flush: true)
}
// Get the role for this user, set authorities to this role and save
def role = Role.findByAuthority(value)
user.authorities = [role]
user.save(flush: true)
}
}
/**
* Create supplied roles
* @param roles list of roles
* @return
*/
def createRoles(def roles) {
roles?.each { role ->
def existingRole = Role.findByAuthority(role) // Code Interrupts Here
if (!existingRole) {
new Role(authority: role).save(flush: true)
}
}
}
}
Upvotes: 1
Views: 464
Reputation: 4177
If you use
static mapWith = 'none'
it won't map this domain class to any DB, so it won't be accessible (because it is not persistent). Add mapping to any db (it could be even default h2 database) and it'll work again.
Upvotes: 1