1

本番サーバーで非常に奇妙な動作をしています。

サーバーを初めて起動するときは問題ありませんが、サーバーを停止して再起動すると、次のエラーが表示されます。

Configuring Spring Security Core ...
... finished configuring Spring Security Core

2013-10-31 12:03:08,156 [localhost-startStop-1] ERROR context.GrailsContextLoader  - Error initializing the application: null
java.lang.NullPointerException
        at com.aftmevent.security.UserRole.create(UserRole.groovy:32)
        at BootStrap$_closure1.doCall(BootStrap.groovy:16)
        at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:308)
        at grails.util.Environment.executeForEnvironment(Environment.java:301)
        at grails.util.Environment.executeForCurrentEnvironment(Environment.java:277)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        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:724)
2013-10-31 12:03:08,156 [localhost-startStop-1] ERROR context.GrailsContextLoader  - Error initializing Grails: null
java.lang.NullPointerException
        at com.aftmevent.security.UserRole.create(UserRole.groovy:32)
        at BootStrap$_closure1.doCall(BootStrap.groovy:16)
        at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:308)
        at grails.util.Environment.executeForEnvironment(Environment.java:301)
        at grails.util.Environment.executeForCurrentEnvironment(Environment.java:277)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        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:724)
oct. 31, 2013 12:03:08 PM org.apache.catalina.core.StandardContext startInternal

ここに私の BootStrap.groovy があります:

class BootStrap {

    def springSecurityService
    def init = { servletContext ->
        def existingAdminRole = Role.findByAuthority('ROLE_ADMIN')
        def existingUserRole = null
        def existingAdminUser = null
        if (existingAdminRole) {
            existingUserRole = UserRole.findByRole(existingAdminRole)
        }
        if (existingUserRole) {
            existingAdminUser = existingUserRole.user
        }
        if (!existingAdminUser) {
            def adminRole = new Role(authority: 'ROLE_ADMIN')
            def adminUser = new User(username: 'admin', password: 'admin', enabled: true)
            if (adminRole.validate()) {
                adminRole.save(flush: true, failOnError: true)
            }
            if (adminUser.validate()) {
                adminUser.save(flush: true, failOnError: true)
            }
            UserRole userRole = UserRole.create(adminUser, adminRole, true)
            if (userRole.validate()) {
                userRole.save(flush: true, failOnError: true)
            }
        }
    }
    def destroy = {
    }
}

これが私の User.groovy です(null許容制約を追加しても問題は解決しませんでした):

User.groovy :

class User {

    transient springSecurityService

    String username
    String password
    boolean enabled
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired

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

    static mapping = {
        password column: '`password`'
    }

    Set<Role> getAuthorities() {
        UserRole.findAllByUser(this).collect { it.role } as Set
    }

    def beforeInsert() {
        encodePassword()
    }

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}

ここに私のクラス Role.groovy と UserRole.groovy があります:

Role.groovy :

class Role {

    String authority

    static mapping = {
        cache true
    }

    static constraints = {
        authority nullable: true, blank: false, unique: true
    }
}

UserRole.groovy :

class UserRole implements Serializable {

    User user
    Role role

    boolean equals(other) {
        if (!(other instanceof UserRole)) {
            return false
        }

        other.user?.id == user?.id &&
            other.role?.id == role?.id
    }

    int hashCode() {
        def builder = new HashCodeBuilder()
        if (user) builder.append(user.id)
        if (role) builder.append(role.id)
        builder.toHashCode()
    }

    static UserRole get(long userId, long roleId) {
        find 'from UserRole where user.id=:userId and role.id=:roleId',
            [userId: userId, roleId: roleId]
    }

    static UserRole create(User user, Role role, boolean flush = false) {
        new UserRole(user: user, role: role).save(flush: flush, insert: true)
    }

    static boolean remove(User user, Role role, boolean flush = false) {
        UserRole instance = UserRole.findByUserAndRole(user, role)
        if (!instance) {
            return false
        }

        instance.delete(flush: flush)
        true
    }

    static void removeAll(User user) {
        executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user: user]
    }

    static void removeAll(Role role) {
        executeUpdate 'DELETE FROM UserRole WHERE role=:role', [role: role]
    }

    static mapping = {
        id composite: ['role', 'user']
        version false
    }
}

データベース設定を含む私の DataSource.groovy ファイルは次のとおりです。

environments {
    development {
        dataSource {
            dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
            driverClassName = 'com.mysql.jdbc.Driver'
            username = 'root'
            password = 'root'
            url = 'jdbc:mysql://localhost:3306/database?autoreconnect=true&useUnicode=true&characterEncoding=utf-8'
        }
    }
    test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
        }
    }
    production {
        dataSource {
            dbCreate = 'create-drop'
            driverClassName = 'com.mysql.jdbc.Driver'
            username = 'root'
            password = 'root'
            url = 'jdbc:mysql://localhost:3306/database?autoreconnect=true&useUnicode=true&characterEncoding=utf-8'
        }
    }
}

何が起こったのか、まったくわかりません。null 許容制約を追加し、databe を「create-drop」/「update」に入れようとしました。

面白いことに、データベースを削除してから再度作成すると、最初のサーバーの起動は良好ですが、再起動後にクラッシュします。

println ログを BootStrap.groovy に入れようとしましたが、開発環境では確認できますが、運用サーバーでは確認できません。

したがって、BootStrap が更新されて war が作成されているかどうかはわかりません。

以下を使用して戦争を作成します。

grails prod war target/my-new-war-0.0.x.war

読んでくれてありがとう、

スナイト

4

3 に答える 3

0

私の問題を解決するのに役立つすべての回答に感謝します。

ばかげていましたが、運用サーバーに戦争を展開する私の rundeck スクリプトでは、使用されたのは古いバージョンの戦争でした - _ -

したがって、正しい戦争バージョンを使用して手動で実行し、問題を解決してください。

あなたのアドバイスは、grails のフレームワークに関する適切なドキュメントを読むのに役立ち、ここを見て考えるのに役立ちます。

乾杯、

スナイト

于 2013-11-01T20:06:04.173 に答える