Attualmente sto sviluppando un'applicazione Grails e sto lavorando con i plug-in Spring Security e UI. Ho creato il rapporto tra la classe utente e un altro Area Classe che ho che può essere visto qui sotto:Grails - salva l'istanza transitoria prima di svuotare i graal Errore?
User Class:
class User {
transient springSecurityService
String username
String email
String password
boolean enabled
boolean accountExpired
boolean accountLocked
boolean passwordExpired
static belongsTo = [area:Areas]
.......
}
Area Classe:
class Areas {
String name
static hasMany = [users:User]
}
Come si può vedere dalle classi un utente può essere collegato a un'area, ma un'area potrebbe avere molti utenti. Funziona tutto bene e quando eseguo il bootstrap dell'applicazione tutti i dati vengono aggiunti correttamente. tuttavia ottengo il seguente errore quando provo ad utilizzare un modulo per creare un nuovo utente:
object references an unsaved transient instance - save the transient instance before flushing: com.website.Area
sotto è il codice di controllo che sto usando per salvare le informazioni:
def save = {
def user = lookupUserClass().newInstance(params)
if (params.password) {
String salt = saltSource instanceof NullSaltSource ? null : params.username
user.password = springSecurityUiService.encodePassword(params.password, salt)
}
if (!user.save(flush: true)) {
render view: 'create', model: [user: user, authorityList: sortedRoles()]
return
}
addRoles(user)
flash.message = "${message(code: 'default.created.message', args: [message(code: 'user.label', default: 'User'), user.id])}"
redirect action: edit, id: user.id
}
ed ecco un esempio di ciò che l'SPG assomiglia:
<table>
<tbody>
<s2ui:textFieldRow name='username' labelCode='user.username.label' bean="${user}"
labelCodeDefault='Username' value="${user?.username}"/>
<s2ui:passwordFieldRow name='password' labelCode='user.password.label' bean="${user}"
labelCodeDefault='Password' value="${user?.password}"/>
<s2ui:textFieldRow name='email' labelCode='user.email.label' bean="${user}"
labelCodeDefault='E-Mail' value="${user?.email}"/>
<s2ui:textFieldRow readonly='yes' name='area.name' labelCode='user.area.label' bean="${user}"
labelCodeDefault='Department' value="${area.name}"/>
<s2ui:checkboxRow name='enabled' labelCode='user.enabled.label' bean="${user}"
labelCodeDefault='Enabled' value="${user?.enabled}"/>
<s2ui:checkboxRow name='accountExpired' labelCode='user.accountExpired.label' bean="${user}"
labelCodeDefault='Account Expired' value="${user?.accountExpired}"/>
<s2ui:checkboxRow name='accountLocked' labelCode='user.accountLocked.label' bean="${user}"
labelCodeDefault='Account Locked' value="${user?.accountLocked}"/>
<s2ui:checkboxRow name='passwordExpired' labelCode='user.passwordExpired.label' bean="${user}"
labelCodeDefault='Password Expired' value="${user?.passwordExpired}"/>
</tbody>
</table>
ho guardato in questo e credo che sia il modo in cui sto cercando di salvare un oggetto GORM e dovrei forse salvare il genitore (Regione) prima di tentare di salvare il utente. Tuttavia l'Area esisterà sempre prima che l'utente possa essere creato, quindi non ho bisogno che l'area venga creata di nuovo, come posso gestirla? Ho provato la funzione "withTransaction" con scarso successo anche
Sarei davvero grato di un aiuto su questo se possibile.
Grazie
EDIT ......
ho monitorato il problema a questa linea nel Controller:
RegistrationCode registrationCode = springSecurityUiService.register(user, command.password, salt)
Questo mi dicono che questa funzione sta chiamando un salvataggio funzione per l'oggetto utente, tuttavia con le relazioni in atto è necessario prima salvare l'Area. Qualcuno conosce SpringSecurityUi per aiutarmi in questo?
Grazie
Inserire il server di sicurezza nel controller, non nella classe di dominio. – marko
Potete fornirmi un esempio per favore? poiché il servizio di sicurezza delle molle è sempre stato lì – user723858
L'errore non sarebbe correlato alla classe "com.website.Area" come dice l'errore? Grazie – user723858