将Grails 3.0插件域类定义为可扩展

时间:2015-06-12 08:33:39

标签: grails groovy grails-plugin grails-domain-class grails-3.0

开发Grails 3.0插件时:

  1. 如何定义域以便应用程序可以使用插件扩展它?
  2. 插件如何引用扩展类的实例?
  3. 例如,安全插件可以包含以下类:

    User.groovy

    package com.example.plugins.security
    
    class User {
    
       String  email
       String  hash
       Boolean enabled = true
    
    }
    

    SecurityService.groovy

    package com.example.plugins.security
    
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
    
    class SecurityService {
    
       def authenticate(String email, String password) {
          def user = User.findByEmail(email)  //instance of BookstoreUser???
          def encoder = new BCryptPasswordEncoder()
          return user && encoder.matches(password, user.hash) ? user : null
          }
    
    }
    

    该应用程序将具有以下域名:

    的grails-app /域/ COM /示例/书店/ BookstoreUser.groovy

    package org.example.bookstore
    
    import org.bson.types.ObjectId
    import org.example.plugins.security.User
    
    class BookstoreUser extends User {
    
       ObjectId id
       String   firstName
       String   lastName
    
       static mapWith = "mongo"
    
    }
    

    其余代码位于:https://github.com/center-key/bookstore

1 个答案:

答案 0 :(得分:0)

  

如何定义域以便可以通过扩展域进行扩展   使用插件的应用程序?

与定义任何其他域类的方式相同。在grails-app/domain/下声明Groovy源文件。

  

插件如何引用扩展类的实例?

您在问题中显示的代码可以正常工作。

package com.example.plugins.security

class SecurityService {

   def disableUser(User user) {  //the instance should be a BookstoreUser
          user.enabled = false
          user.save()
      }
}

如果某个应用程序编写了一个扩展您的BookstoreUser类的类User,那么BookstoreUser的实例可以传递到您的disableUser方法中,该方法将表现为你可能期望它应该。该方法将enabled属性设置为false,然后保存更新的实例。