gpt4 book ai didi

grails - 实现 Grails 服务时的继承问题

转载 作者:行者123 更新时间:2023-12-02 14:22:33 24 4
gpt4 key购买 nike

那么,在实现 Grails 服务时不建议使用继承方法吗?我经历了一个简单的服务特化模式,了解一切都将以透明的方式工作,但我开始在 spring/grails 引擎盖下的事务管理方面遇到麻烦。当专用类中的方法调用继承类中的方法(都是具体服务本身)时,会出现问题:

@Transactional
public class MammalService {

public mammalMethod() {
}

}

@Transactional
public class DogService extends MammalService {

public dogMethod() {
mammmalMethod()
}

}

就是当继承的方法被专门的方法调用时, org.springframework.transaction.support.GrailsTransactionTemplate()构造函数被触发(由 spring/grails 事务 AOP)并带有一个 null transactionManager参数,这会导致一些 NullPointerException而且。

有没有人在服务中使用过这种方法?我错过了什么吗?

PS:奇怪的是,我尝试更改 @grails.transaction.Transactional @org.springframework.transaction.annotation.Transactional 的注释和 NullPointerException停止发生。 (尽管如此,它并没有指出一个好的解决方案,因为我的池管理开始出现其他副作用)。

更新1:在调试时,我可以在我的专业服务中看到两个同名的变量transactionManager(检查具体父类(super class)时不会发生这种情况)。

error

我将在 Duplicated transactionManager property in Grails service 上打开一个更具体的问题

最佳答案

Solved by removing @Transaction from specialized service classes and methods, keeping them only on the inherited service class and its methods.


@Transactional
public class MammalService {

@Transactional(readonly=true)
public mammalMethod() {
}

}

//Don't annotate with @Transactional - rely on the super class declaration
public class DogService extends MammalService {

//Don't annotate with @Transactional - rely on the super class transactional declaration
public dogMethod() {
mammmalMethod()
}

}

看来,对于专门的服务类,事务例程尝试重新注入(inject) transactionManager属性,导致两个具有相同名称的属性,其中一个为空。此外,注释覆盖的方法会引发 StackOverflowException。

关于grails - 实现 Grails 服务时的继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37716752/

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