2015-12-02 40 views
0

我必須從我的域調用我的控制器的一種方法。我試圖找到一些答案,但我沒有找到任何東西,我不確定是否有可能。對不起,如果我的問題是錯誤的,但在我有我必須找到一個解決方案,因爲我已經在我的域中的方法beforeInsert()內部做的問題。如何在grails中調用域內的服務方法?

這是我嘗試運行該項目時的錯誤:

|錯誤2015-12-02 10:59:29,210 [localhost-startStop-1]錯誤hibernate.AssertionFailure - 發生斷言失敗(這可能表示Hibernate中存在錯誤,但更可能是由於會話的不安全使用) 消息:在com.xxxx進入空ID(不發生異常後刷新會議)

控制器的方法:

def calculate(Integer max){ 
     params.max = Math.min(max ?: 10, 100) 
     def users= User.findAllByType(null) 
     LicenceTypeService.calculate(users) //This call a service 
     redirect(action: "list", params: params) 
    } 

在我的域名:

protected void callCalculateWhencreateUser(){ 
     def users= User.find("from User order by id desc") 
     LicenceTypeService.calculate(users) //This call a service 
    } 

def beforeInsert() { 
     encodePassword() 
     callCalculateWhencreateUser() 
    } 

在我的服務:

def calculate(def users){ 

     //logic code 

    } 
+0

不確定靜態調用您的服務是否正確,因爲它可能沒有被grails應用程序正確初始化。只需將您的服務連接到您的控制器和域名,然後按正常方式打電話。 – shuttsy

+0

你能舉個簡單的例子嗎?我在grails中是新的.. –

回答

2

您的問題的主題有誤導性:您說您需要從域中調用控制器方法,但是您的代碼說的是您試圖從域和控制器調用服務方法。

您無法從域調用控制器方法,在概念上是錯誤的,但是您也需要請求調用控制器,並且您沒有在域中擁有它。

但是,你要做的是實現它的方式:將邏輯留給服務並從控制器和域調用它。但是你做錯了。

在你需要聲明的服務控制器,所以春天將注入到你的控制器,就像這樣:

class MyController { 
    def licenceTypeService 

    def calculate(Integer max){ 
     params.max = Math.min(max ?: 10, 100) 
     def users = User.findAllByType(null) 
     licenceTypeService.calculate(users) 
     redirect(action: "list", params: params) 
    } 
} 

您可以在服務屬性的聲明中使用的實際類型,而不是高清的,但重要的是,屬性名稱是服務的「邏輯名稱」:類名稱,但小寫的第一個字母。這樣,財產將在春季注入。

您應該爲「用戶」更改變量「user」,它會讓您認爲這是單個用戶,但您使用的查找器會返回用戶列表。

在域上你只需要做更多的工作。您需要以相同的方式注入服務,但需要將其添加到「瞬變」列表中,因此GORM不會嘗試在數據庫中爲其創建字段或從數據庫檢索它。

像這樣:

class MyDomain { 

    def licenceTypeService 

    static transients = [ "licenseTypeService" ] 

    def beforeInsert() { 
     encodePassword() 
     licenceTypeService.calculate(this) 
    } 
} 

而且你的服務將是這樣的:

class LicenceTypeService { 

    def calculate(User user) { 
     // perform some calculation 
     // do not call user.save() since this will be invoked from beforeInsert 
    } 

    def calculate(List<User> users) { 
     // If this is performed on several users it should be 
     // done asynchronously 
     users.each { 
      calculate(it) 
      it.save() 
     } 
    } 
} 

希望有所幫助。

但是,根據你在計算方法中做了什麼(對於單個用戶),它可以是User類的一種方法(這是一個更OO的解決方案)。

+0

我做了你的步驟,但我有同樣的錯誤.... –

+0

問題可能是你在執行beforeInsert事件中的查詢。我不明白你在服務中想做什麼:你將用戶列表傳遞給calculate方法,而不是你剛剛創建的用戶。如果你想要實現的是在創建一個新用戶(危險)時對所有用戶執行一些計算,那麼你應該使用像jms這樣的分離系統來在不同的線程中創建該進程,然後在保存控制器的方法或更好,從服務中添加一個「保存用戶」方法。 – ncerezo

+0

hmmmm。好。如何匹配我剛剛創建的用戶?謝謝 –

相關問題