我在使用EJB和Spring MVC的应用程序中使用Hibernate Validator。我正在使用JBoss 5,Hibernate 3和Spring MVC第3版。
我想在Spring Exception Resolver级别尝试捕获验证异常,并根据InvalidStateException
消息生成错误消息。我不想在数据访问层中放置异常处理逻辑;我希望它由注释驱动,只需在一个集中的位置处理验证错误。
正在验证域模型,并且当我尝试创建无效实体时(例如违反字段上的长度约束),会按预期抛出类型InvalidStateException
的异常。在尝试在我的Spring Exception解析器实例中捕获异常时,我发现原来的异常已经消失,javax.ejb.EJBTransactionRolledbackException
取代了它。原始异常不在列表中。
我的第一个猜测是org.hibernate.validator.InvalidStateException
未使用ApplicationException
进行注释,因此我安装了一个Hibernate事件侦听器,捕获了原始异常并将其重新提交为使用ApplicationException
注释的新异常。这没有效果。
另一个复杂性是Web层通过Remote接口调用EJB。我用WebFault
注释了我的异常类,但没有用。
我应该怎么做以确保异常气泡一直上升?
答案 0 :(得分: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;
}