2009-11-12 80 views
0

我在使用EJB和Spring MVC的应用程序中使用Hibernate Validator。我使用JBoss 5时,Hibernate 3和Spring MVC版本3.Hibernate验证程序异常

我想尝试和捕捉验证异常在春季异常解析器水平,并基于该InvalidStateException消息的错误消息。我不想在数据访问层中放置异常处理逻辑;我希望这是由注释驱动,并在一个集中的地方处理验证错误。

当我尝试创建无效实体(例如,违反字段上的长度约束)时,域模型正在被正确验证,并且类型InvalidStateException的异常被按预期抛出。在试图在我的Spring Exception解析器实例中捕获异常的时候,我发现我原来的异常已经消失,并取代了它的位置。原来的例外不在列表引起的。

我的第一个猜测是org.hibernate.validator.InvalidStateException没有用ApplicationException注释,所以我安装了一个Hibernate事件侦听器,捕获了原始异常,并将其重新引发为一个新的异常,注解为ApplicationException。这没有效果。

另一个复杂性是Web层通过远程接口调用EJB。我注释了我的异常类WebFault,但无济于事。

我应该怎么做才能确保例外气泡一路向上?

回答

2

试试这个吗?

protected InvalidStateException extractValidationException(Throwable ex) { Throwable e = ex; while (e != null) { if (e instanceof InvalidStateException) { return (ValidationException) e; } else if (e instanceof EJBException) { e = ((EJBException) e).getCausedByException(); } else { e = e.getCause(); } } return null; }

+0

谢谢 - 我没有看到EJBException方法“getCausedByException”。我明天会看看这个,并接受它是否有效! – 2009-11-12 20:52:05

+0

是的,声明一个具有相同想法的新方法有点奇怪。 – Bozho 2009-11-12 21:11:21