gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:23:44 26 4
gpt4 key购买 nike

我对 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com