Плагин Grails Spring Security - ОДНО-ОДИН объединение с доменом пользователя - PullRequest
3 голосов
/ 02 марта 2011

Я использую Spring Security Plugin для управления членством и аутентификацией в своем приложении Grails.

Я пытаюсь связать класс домена пользователя с доменом профиля с помощью однозначного сопоставления.

Я добавил эти строки в User.groovy:

static hasOne = [userProfile:UserProfile]
static constraints = {
//...
             userProfile unique:true
}

и в UserProfile.groovy:

User user

Увы, при вызове UseRole.create (user произошла ошибка),роль).

Существует несколько рекомендаций о том, как получить ту же функциональность, которую я ищу.В частности, я хочу связать любого пользователя с одним объектом профиля, чтобы расширить его.

Я хочу затем также добавить отношения один-ко-многим с сообщениями и другой таблицей ...

Спасибо.regards

PS: я получаю эту ошибку:

Настройка Spring Security UI ... 2011-03-08 12: 18: 51,179 [main] ОШИБКА context.GrailsContextLoader - Ошибка при выполнении начальной загрузки: nulljava.lang.NullPointerException в $ Proxy19.save (неизвестный источник) в com.dromedian.xxxxx.security.UserRole.create (UserRole.groovy: 32) в com.dromedian.xxxxx.security.UserRole $ create.call (неизвестный источник) в BootStrap $ _closure1.doCall (BootStrap.groovy: 20) в grails.util.Environment.evaluateEnvironmentSpecificBlock (Environment.java:251) в grails.util.Environment.executeForEnvironment (Environment.java:244) в grails.util.Environment..executeForCurrentEnvironment (Environment.java:220) в org.grails.tomcat.TomcatServer.start (TomcatServer.groovy: 212) в grails.web.container.EmbeddableServer $ start.call (неизвестный источник)на _GrailsRun_groovy $ _run_closure5_closure12.doCall (_GrailsRun_groovy: 158) в _GrailsRun_groovy $ _run_closure5_closure12.doCall (_GrailsRun_groovy) в _GrailsSettings_groovy $ _run_closure10.doCall (_GrailsSettings_groovy: 280) в _GrailsSettings_groovy $ _run_closure10.call (_GrailsSettings_groovy) в _GrailsRun_groovy $ _run_closure5.doCall (_GrailsRun_groovy: 149) при _GrailsRun_groovy $ _run_closure5.call (_GrailsRun_groovy) при _GrailsRun_groovy.runInline (_GrailsRun_groovy: 116) в _GrailsRun_groovy.this $ 4 $ runInline (_GrailsRun_groovy) при _GrailsRun_groovy $ _run_closure1.doCall (_GrailsRun_groovy: 59) в RunApp $ _run_closure1.doCall (RunApp.groovy: 33) в gant.Gant $ _dispatch_closure5.doCall (Gant.groovy: 381) в gant.Gant $ _dispatch_closure7.doCall (Gant.groovy: 415) в gant.Gant $ _dispatch_closure7.doCall (Gant.groovy) в gant.Gant.withBuildListeners (Gant.groovy: 427) в gant.Gant.this $ 2 $ с помощью BuildListeners (Gant.groovy) в gant.Gant $ this $ 2 $ сBuildListeners.callCurrent (неизвестный источник) в gant.Gant.dispatch (Gant.groovy: 415) в gant.Gant.this $ 2 $ (Gant.groovy) в gant.Gant.invokeMethod (Gant.groovy) в gant.Gant.executeTargets (Gant.groovy: 590) в gant.Gant.executeTargets (Gant.groovy: 589) Завершение работы контекста приложения ...

Конфигурация:

User.groovy (класс домена, созданный плагином безопасности Spring)

    static hasOne = [userDetail:UserDetail]

static constraints = {
    username blank: false, unique: true
    password blank: false
            userDetail unique:true
}

UserDetail.groovy

static hasOne = [user:User]
static belongsTo = User

BootStrap.groovy

    //TODO temporary added - no for production or persistent db
    def adminRole = new Role(authority: 'ROLE_ADMIN').save(flush: true)
    def userRole = new Role(authority: 'ROLE_USER').save(flush: true)

    String password = springSecurityService.encodePassword('password')
    def testUser = new User(username: 'me', enabled: true, password: password)
    testUser.save(flush: true)
    if(testUser != null){
        UserRole.create testUser, adminRole, true
    }

Если я не позвоню

        UserRole.create testUser, adminRole, true

, ошибки нет.Я попытался отладить, но я могу понять, где ошибка.

Ответы [ 3 ]

1 голос
/ 16 июня 2011

Как объяснялось ранее, ваш тестовый пользователь не сохраняется, так как требуется профиль пользователя. Метод save для пользователя вернул бы null, однако вы не проверяете это. Я обычно помещаю метод в эти строки в:

def ensureSave(domainObject) {
 if(!domainObject.save(flush:true)) {
  throw new Exception("not saved successfully: $domainObject");
 }
 domainObject
}

А затем обратитесь к нему следующим образом:

ensureSave(testUser)

или

testUser = ensureSave(new User(...));

НТН

0 голосов
/ 12 января 2013

Я только что столкнулся с подобной проблемой ... и вывел это:

Ваш связанный класс должен явно иметь нулевое значение ... то есть:

static constraints = {
   ...
   userDetail unique:true, nullable: true
   ...
}

Если вы этого не сделаете, вызов конструктора для вашего класса завершится неудачно (как уже отмечали другие, и попытка создать UserRole при нулевом сбое)

0 голосов
/ 17 марта 2011

Я думаю, вы должны установить UserProfile в конструкторе.Поскольку вы не предоставляете один из них, save () завершается ошибкой, что дает вам NullPointerException.

UserDetail profile = new UserDetail()
def testUser = new User(username: 'me', enabled: true, password: password, userdetail: profile)
assert testUser.save()

Утверждение через вызовы .save () оказалось довольно полезным, как часто, когда вы меняете кодкласс вашего домена, который вы создаете, не будет работать в файле начальной загрузки, если вы забудете изменить их.Поскольку Grails довольно изящно справляется с этим, вы получаете странные ошибки, вместо этого вы получаете сообщение, в котором это поможет вам больше всего.Размещая утверждения, он остановится непосредственно там, где проблема.

...