Я новичок в JPA и хочу найти лучшие практики при обработке исключений сохранения из JPA для таких вещей, как say, уникальные нарушения ограничений, которые могут быть устранены пользователем. Существует множество примеров того, как писать приложения 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)=([email protected]) already exists.
Как я могу получить полезный ответ пользователю? Например, что-то вроде: Уп выглядит, что кто-то уже использует этот адрес электронной почты, вы уверены, что не зарегистрированы раньше? Есть ли встроенный механизм для синтаксического анализа этого или мне нужно будет запускать регулярные выражения против сообщения об исключении из (если возможно, ряда) if statement (s)?
А как насчет того, поймают ли они на бизнес-уровне... что лучше всего подходит для уровня презентации... как я уже говорил, так что для пользователя может быть предоставлено "приятное" сообщение.
Добавлен для ясности: Просто люди знают, что у меня есть, и я все еще смотрю на все типы исключений настойчивости, и вот некоторые из исследований, которые я делал, я не включал в себя пример "примера попыток", который я включил выше
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());
}
:)