0

我是 grails 菜鸟,我正在关注本教程: 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会有所帮助。但是代码还有其他问题。

一个是您应该检查!contains,而不是contains- 如果用户/角色授权不存在,请授予它。但是使用的方法效率低下 - 它返回所有现有记录并检查匹配。equals除非您创建好的和hashCode方法(但这里不是这种情况),否则使用代理时也可能会失败。检查这一行是否存在要好得多,而且使用 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 回答
1

这不是一个答案,而是关于如何通过使用findOrSaveWherefindOrSaveBy*在很大程度上减少代码的意见。

class BootStrap {
   def init = { servletContext ->
      def adminRole = Role.findOrSaveByAuthority('ROLE_ADMIN')
      def userRole = Role.findOrSaveByAuthority('ROLE_USER')

      //findOrCreateBy would be lengthy here as well, so back to original code
      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)
      }

      //findOrCreateBy would be lengthy here as well, so back to original code
      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-09-01T00:26:21.230 回答