我对 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());
}
:)