那么,在实现Grails服务时是不是建议使用继承方法?我经历了一个简单的服务专业化模式理解,所有这些都将以透明的方式工作,但我开始陷入关于spring / grails hood下的事务管理的麻烦。当来自专用类的方法从继承的类调用方法(两个具体服务本身)时会发生问题:
@Transactional
public class MammalService {
public mammalMethod() {
}
}
@Transactional
public class DogService extends MammalService {
public dogMethod() {
mammmalMethod()
}
}
当从专用的方法调用继承的方法时,org.springframework.transaction.support.GrailsTransactionTemplate()
构造函数被弹出/ grails事务AOP触发,并带有一个空transactionManager
参数,这导致一些{{1此外。
有没有人用这种方法提供服务?我错过了什么吗?
PS:奇怪的是,我尝试按NullPointerException
更改@grails.transaction.Transactional
注释,@org.springframework.transaction.annotation.Transactional
停止发生。 (尽管如此,它并没有指向一个很好的解决方案,因为我的池管理开始出现其他副作用。)
UPDATE1:在调试时,我可以在我的专业服务中看到两个具有相同名称transactionManager的变量(在检查具体超类时不会发生这种情况)。
打开了一个更具体的问题答案 0 :(得分:3)
通过从专门的服务类中删除@Transaction来解决问题 方法,只保留在继承的服务类及其方法上。
@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()
}
}
对于专门的服务类,似乎事务例程尝试重新注入transactionManager
属性,从而导致两个属性具有相同的名称,其中一个属性为null。此外,注释覆盖的方法会引发StackOverflowException。