gpt4 book ai didi

grails - 如何在grails中调用域内的服务方法?

转载 作者:行者123 更新时间:2023-12-02 15:00:02 25 4
gpt4 key购买 nike

我必须从我的域中调用我的 Controller 的一种方法。我试图找到一些答案,但我什么也没找到,我不确定是否可能。抱歉,如果我的问题是错误的,但是在我的要求中,我必须为此找到解决方案,因为我已经在我的域中的方法 beforeInsert() 中做到了。

这是我尝试运行项目时的错误:

|错误 2015-12-02 10:59:29,210 [localhost-startStop-1] 错误 hibernate.AssertionFailure - 发生断言失败(这可能表明 Hibernate 中存在错误,但更有可能是由于 session 使用不安全)
消息:com.xxxx 条目中的空 id(发生异常后不要刷新 session )

Controller 方法:

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

}

最佳答案

您的问题具有误导性:您说您需要从域调用 Controller 方法,但您的代码说的是您试图从域和 Controller 调用服务方法。

您不能从域中调用 Controller 方法,这在概念上是错误的,而且您需要一个请求来调用 Controller 并且您在域中没有它。

但是,您尝试做的实际上是这样做的方法:将逻辑留给服务并从 Controller 和域调用它。但是你做错了。

在 Controller 中你需要声明服务,所以spring会将它注入(inject)你的 Controller ,就像这样:

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)
}
}

您可以在服务属性的声明中使用实际类型而不是 def,但重要的是属性名称是服务的“逻辑名称”:类名称,但第一个字母小写。这样,该属性将在 Spring 注入(inject)。

您应该将变量“user”更改为“users”,这会让您认为这是单个用户,但您使用的查找器会返回用户列表。

在域上,您只需做更多的工作。您需要以相同的方式注入(inject)服务,但需要将其添加到“transients”列表中,因此 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 类的方法(这是一个更面向对象的解决方案)。

关于grails - 如何在grails中调用域内的服务方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34041207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com