实现Grails服务时继承的问题

时间:2016-06-09 04:20:06

标签: grails

那么,在实现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的变量(在检查具体超类时不会发生这种情况)。

error

我在Duplicated transactionManager property in Grails service

打开了一个更具体的问题

1 个答案:

答案 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。