Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can@ApplicationException';在EJB3.1中是否重写继承?_Java_Ejb 3.1 - Fatal编程技术网

Java Can@ApplicationException';在EJB3.1中是否重写继承?

Java Can@ApplicationException';在EJB3.1中是否重写继承?,java,ejb-3.1,Java,Ejb 3.1,如果我有一个@ApplicationException异常(继承=true,回滚=true),但我希望一个子类不回滚。我可以用@ApplciationException(rollback=false)注释子类吗?还是这行不通?规范似乎没有说,我可以找到。没有明确说明在这种情况下应该发生什么。它确实指定部署描述符元素将覆盖特定EJB的任何带注释的值: 应用程序异常不会自动导致标记 用于回滚的事务,除非ApplicationException注释 应用于异常类,并指定了回滚 元素值true或应用程序

如果我有一个@ApplicationException异常(继承=true,回滚=true),但我希望一个子类不回滚。我可以用@ApplciationException(rollback=false)注释子类吗?还是这行不通?规范似乎没有说,我可以找到。

没有明确说明在这种情况下应该发生什么。它确实指定部署描述符元素将覆盖特定EJB的任何带注释的值:

应用程序异常不会自动导致标记 用于回滚的事务,除非ApplicationException注释 应用于异常类,并指定了回滚 元素值true或应用程序异常部署描述符 异常元素将回滚元素指定为true。这个 应用程序异常部署描述符的回滚子元素 元素可以明确指定为覆盖回滚值 ApplicationException注释指定或默认的

这与其他Java EE组件的注释工作方式(
@TransactionAttribute
@ConcurrencyManagement
等)相结合,将导致人们强烈地认为子类
@ApplicationException
注释将覆盖其父类的注释。我通过一个简单的测试证实了这一点(显示的代码不完整):

结果:

  • 请求/misc/exception/app/1会导致屏幕上出现错误,并且不会将任何记录保存到数据库中
  • 请求/misc/exception/app/2会导致屏幕上出现错误,但记录会保存到数据库中,即为
    MySubException2
    处理注释覆盖以不回滚事务

*编辑*

通过使用示例,明确继承的
ApplicationException
注释的行为

在以下示例中:

@ApplicationException(rollback=true)公共类异常扩展 运行时异常

公共类例外B扩展了例外A

@ApplicationException(继承=false,回滚=false)公共类 例外C扩展了例外B

公共类例外扩展例外

ExceptionA是具有事务回滚的应用程序异常。 ExceptionB是具有事务回滚的应用程序异常。 ExceptionC是没有事务回滚的应用程序异常。 ExceptionD不是应用程序异常

这证实了我最初的陈述和测试。

EJB3.1规范(JSR318)在第14.2.1节中对此进行了解释。有一个例子:

In the following example :
@ApplicationException(rollback=true)
public class ExceptionA extends RuntimeException
public class ExceptionB extends ExceptionA
@ApplicationException(inherited=false, rollback=false)
public class ExceptionC extends ExceptionB
public class ExceptionD extends ExceptionC

ExceptionA is an application exception with transaction rollback.
ExceptionB is an application exception with transaction rollback.
ExceptionC is an application exception without transaction rollback.
ExceptionD is not an application exception.

谢谢你的跑腿工作。您在哪个应用服务器上执行此测试?在答案中添加了JSR 318中的额外信息。规范保证了预期的行为。良好的find@bkail。我把它纳入了我的答案中,我在规范中看到了这一点,但当我读到它时,我误解了它,我认为C是一个新的链。
In the following example :
@ApplicationException(rollback=true)
public class ExceptionA extends RuntimeException
public class ExceptionB extends ExceptionA
@ApplicationException(inherited=false, rollback=false)
public class ExceptionC extends ExceptionB
public class ExceptionD extends ExceptionC

ExceptionA is an application exception with transaction rollback.
ExceptionB is an application exception with transaction rollback.
ExceptionC is an application exception without transaction rollback.
ExceptionD is not an application exception.