3

我正在使用 Spring ROO。在我的 Web 应用程序中,我可以创建许多用户并保存。我也可以更新现有用户。

对于更新场景,我们使用 merge() 方法来更新现有数据。在数据库中,“用户名”列是唯一的。以下是场景。

  1. 用户使用手机号码“6039274849”创建用户名“Sean”

  2. 用户创建另一个名为“Parker”的用户,手机号码为“8094563454”

  3. 当用户尝试用“Sean”更新第二个用户“Parker”时,我遇到了异常。

在堆栈跟踪中,我可以看到以下异常是原因

  1. 由 ConstraintviolationException 引起
  2. 由 SQLException 引起
  3. 由 TransactionSystemException 引起
  4. 由 PersistenceException 引起
  5. 由 TransactionRollbackException 引起

我尝试执行以下操作

public String merge()
  {
     try{
          //code to merge
        }
     catch(????? e){
         throw e;
     }
  }

我试图在'????'中添加上述5个例外 . 但我还是抓不住。

谁能告诉我需要在'????'中添加哪个例外 从上面的列表中捕获异常?

PS:我正在使用 Spring ROO。所以我正在更改 .aj 文件中的代码。请不要关闭这个问题作为重复。在结束这个问题之前,我期待任何人对我的问题的回答。

4

4 回答 4

2

作为最后的手段,你可以抓住万能的exception

public String merge()
{
     try{
          //code to merge
        }
     catch(Exception e){
         //handle e here.
     }
}
于 2012-07-19T02:37:56.953 回答
1

嗯,你不是只是在你的捕获中重新抛出异常吗?它应该是跟踪中的“最近”异常,所以ConstraintValidationException.

请注意,通常在 Spring/Hibernate 应用程序中,代码中冒泡的异常是导致事务回滚的原因。如果你捕捉到异常,你可能会阻止它,这可能会导致数据不一致。

于 2012-07-19T02:33:47.277 回答
1

如有疑问,我会尝试捕获 Throwable 并添加断点或将其注销以查看它的确切含义。然后相应地更改代码。

于 2012-07-19T02:47:58.330 回答
1

我最近有同样的问题。似乎spring wrap异常在它自己的异常类中。
我解决了这个问题:

try {
   ...
}
catch(Exception e){
  System.out.println(e.getClass().getName());
}

这样你就会发现真正抛出了什么异常;

于 2012-07-26T07:21:46.373 回答