java - 您如何处理和解析 JPA 持久性异常以向用户提供有意义的消息

标签 java parsing exception jpa exception-handling

我对 JPA 相当陌生,并且希望在处理来自 JPA 的持久性异常时找到最佳实践,例如用户可以解决 的唯一约束违规。有大量关于如何编写 JPA 应用程序的示例,但几乎没有关于如何处理由它们抛出的异常的示例。 :/

例如注册一个用户,这个人输入了一个系统已经在使用中的电子邮件地址,并且违反了约束:

try {
     em.persist(credentials);
} catch (javax.persistence.PersistenceException ex) {

添加重复电子邮件时会产生此错误:

WARNING: SQL Error: 0, SQLState: 23505
SEVERE: ERROR: duplicate key value violates unique constraint "EMAIL_UQ_IDX"
  Detail: Key (email)=(testuser@xyz.com) already exists.

如何才能将有意义的答案返回给用户?例如:哎呀,好像有人已经在使用该电子邮件地址了,你确定你以前没有注册过吗?是否有内置工具来解析这个,或者我需要在(可能是一系列)if 语句中针对异常消息运行正则表达式?

如果它被捕获在业务层怎么办...将其提升到表示层的最佳实践是什么...就像我之前所说的那样,可以为用户提供“好”消息.


为清楚起见添加: 就像人们知道的那样,我曾经,曾经并且仍在研究所有不同类型的持久性异常,这是我一直在做的一些研究,我没有包括在上面包含的“尝试语句”示例中:

try {
     em.persist(credentials);
     } catch (javax.persistence.PersistenceException ex) {
         System.out.println("EXCEPTION CLASS NAME: " + ex.getClass().getName().toString());
         System.out.println("THROWABLE CLASS NAME: " + ex.getCause().getClass().getName().toString());
                Throwable th = ex.getCause();
         System.out.println("THROWABLE INFO: " + th.getCause().toString());
         Logger.getLogger(CredentialsControllerImpl.class
              .getName()).log(Level.INFO, "Credentials Controller "
                  + "persistence exception "
                      + "EXCEPTION STRING: {0}", ex.toString());
         Logger.getLogger(CredentialsControllerImpl.class
              .getName()).log(Level.INFO, "Credentials Controller "
                  + "persistence exception "
                      + "THROWABLE MESSAGE: {0}", th.getMessage());
         Logger.getLogger(CredentialsControllerImpl.class
              .getName()).log(Level.INFO, "Credentials Controller "
                  + "persistence exceptions "
                      + "THROWABLE STRING: {0}", th.toString());
     }

:)

最佳答案

您通常不会使用低级异常来执行此操作。

相反,您明确地检查电子邮件是否可用(使用查询),并仅在电子邮件不存在时保留该电子邮件。

当然,如果两个线程并行执行相同的检查,可能会出现竞争条件,但这种情况非常罕见,并且数据库约束是为了保证唯一性。

关于java - 您如何处理和解析 JPA 持久性异常以向用户提供有意义的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10493053/

相关文章:

java - 如何处理 IntutTypeMismatchException 以再次从用户那里获取正确的输入而不重新运行程序?

Java 泛型和 SuppressWarnings

java - Spring 测试MVC : Testing controller that redirects to another controller

java - 无法使用 HttpURLConnection 下载图像

python - 删除一列中的 char/str 作为从另一列中删除不同 str 的条件 - DF Pandas

c++ - C++ 中的 bool 表达式解析器

ruby-on-rails - 如何挽救 `constantize`方法引发的错误异常?

java - 如何在TimePickerDialog中显示额外1小时

xml - XML 解析器和 XML 处理器是否相同?

c# - 为什么在构造函数中抛出异常会导致空引用?