0

私は grails noob で、このチュートリアルに従っています: http://www.bobbywarner.com/2012/01/05/jump-into-grails-2-0/

私は:クラスBootStrap {

def init = { servletContext ->
    def adminRole = Role.findByAuthority('ROLE_ADMIN') ?: new Role(authority: 'ROLE_ADMIN').save(failOnError: true)
    def userRole = Role.findByAuthority('ROLE_USER') ?: new Role(authority: 'ROLE_USER').save(failOnError: true)

    def user1 = SecUser.findByUsername('bobby') ?: new SecUser(username: 'bobby', enabled: true,  password: 'password').save(failOnError: true)
    if (user1.authorities.contains(userRole)) {
        SecUserRole.create(user1, userRole, true)
    }

    def user2 = SecUser.findByUsername('tony') ?: new SecUser(username: 'tony', enabled: true,  password: 'password').save(failOnError: true)
    if (user2.authorities.contains(userRole)) {
        SecUserRole.create(user1, userRole, true)
    }

    if (user2.authorities.contains(adminRole)) {
        SecUserRole.create(user1, adminRole, true)
    }

    assert SecUser.count() == 2;
...

しかし、起動すると次のようになります。

| Error 2013-08-31 22:29:14,027 [localhost-startStop-1] ERROR context.GrailsContextLoader  - Error initializing the application: Assertion failed: 
assert SecUser.count() == 2
               |       |
               0       false

データベースを確認しましたが、SecUser テーブルに SecUsers がありません。

私が間違っていることについてのアイデアはありますか?

ありがとう

4

2 に答える 2

3

@grantmc が指摘しているように、追加flush:trueすると役立ちます。しかし、コードには他にも問題があります。

1つは、ユーザー/ロールの付与が存在しない場合は付与するのではなく、チェックする必要があること!containsです。containsしかし、使用されているアプローチは非効率的です。既存のすべてのレコードを返し、一致をチェックします。プロキシが使用されている場合も、良いメソッドequalshashCodeメソッドを作成しない限り失敗する可能性があります (ただし、ここでは当てはまりません)。その1行が存在するかどうかを確認する方がはるかに優れており、GORMを使用すると簡単です:

class BootStrap {

   def init = { servletContext ->
      def adminRole = Role.findByAuthority('ROLE_ADMIN') ?:
                      new Role(authority: 'ROLE_ADMIN').save(failOnError: true)
      def userRole = Role.findByAuthority('ROLE_USER') ?:
                     new Role(authority: 'ROLE_USER').save(failOnError: true)

      def user1 = SecUser.findByUsername('bobby') ?:
                  new SecUser(username: 'bobby', enabled: true,  password: 'password').save(failOnError: true, flush: true)
      if (!SecUserRole.findBySecUserAndRole(user1, userRole)) {
         SecUserRole.create(user1, userRole, true)
      }

      def user2 = SecUser.findByUsername('tony') ?:
                  new SecUser(username: 'tony', enabled: true,  password: 'password').save(failOnError: true, flush: true)
      if (!SecUserRole.findBySecUserAndRole(user2, userRole)) {
         SecUserRole.create(user2, userRole, true)
      }

      if (!SecUserRole.findBySecUserAndRole(user2, adminRole)) {
         SecUserRole.create(user1, adminRole, true)
      }

      assert SecUser.count() == 2
      assert SecUserRole.count() == 3
      assert Role.count() == 2
   }
}
于 2013-08-31T23:28:26.917 に答える